志在指尖
用双手敲打未来

网络爬虫python(python爬虫速度)

网络爬虫python

(一):为什么要学习网络爬虫?
大数据成为当今年代的热门话题之一,在数据量爆发增长的互联网年代,网站与用户沟通本质为数据的交换。假如大量的数据得以分析,我们能够对事件的观点,处理方案做出更好的决策。而网络爬虫技能,则是大数据分析领域的第一个环节。
(二):能从网络上爬取什么数据?
一切在网页能见到的数据都能够通爬虫程序保存下来。
(三):python爬虫的流程
获取网页——解析网页(提取数据)——存储数据
1:获取网页:给一个网址发送恳求,该网址会返回整个网页的数据。
根底技能:requests模块、urllib模块、selenium模块
进阶技能:多进程多线程抓取、登录抓取、打破IP封禁、运用服务器抓取。
2:解析网页:从整个网页中提取想要的数据。
根底技能:re正则表达式、BeautifulSoup和lxml。
进阶技能:处理中文乱码
3:存储数据:把数据存储下来,可存放到数据库,也可存在csv中。
根底技能:存入txt文件和存入csv文件
进阶技能:存入MySQL数据库和MongoDB数据库
(四)编写第一个网络爬虫
1:运用pip装置第三方库:pip是Python装置第三方库(package)的东西,装置的第三方库:bs4:运用其中的BeautifulSoup解析网页。
requests:获取网页地址。
2:运用编辑器Pycharm编程。(如有小伙伴遇到装置问题,请联络小编,小编义不容辞)
3:请开端你的扮演:
第一步:获取页面:
importrequests#导入第三方库
link=”https://www.baidu.com/”#界说link为爬取方针网页地址
#界说恳求头的浏览器署理,伪装成浏览器
headers={‘User-Agent’:’Mozilla/5.0(WindowsNT10.0;Win64;x64)’
‘AppleWebKit/537.36(KHTML,likeGecko)’
‘Chrome/87.0.4280.88Safari/537.36Edg/’
‘87.0.664.60’}
r=requests.get(url=link,headers=headers)#恳求网页
print(r.text)#获取网页内容代码
浏览器检查恳求头的办法:在网页按下鼠标右键——检查——Network——按下Ctrl+R——点击与该网页地址相同的Name——Header——User-Agent(滑到底部即可看到)
恳求头的作用:在恳求网页爬取的时分,输出的text信息中会出现抱愧,无法拜访等字眼,这便是制止爬取,需求通过反爬机制去处理这个问题。headers是处理requests恳求反爬的办法之一,相当于我们进去这个网页的服务器本身,假装自己本身在爬取数据。对反爬虫网页,能够设置一些headers信息,模仿成浏览器取拜访网站。
第二步:提取需求的数据
importrequests#导入第三方库
frombs4importBeautifulSoup#从bs4导入BeautifulSoup
link=”https://www.baidu.com/”#界说link为爬取方针网页地址
#界说恳求头的浏览器署理,伪装成浏览器
headers={‘User-Agent’:’Mozilla/5.0(WindowsNT10.0;Win64;x64)’
‘AppleWebKit/537.36(KHTML,likeGecko)’
‘Chrome/87.0.4280.88Safari/537.36Edg/’
‘87.0.664.60’}
r=requests.get(url=link,headers=headers)#恳求网页
soup=BeautifulSoup(r.text,’html.parser’)#运用BeautifulSoup解析
#找到你想要的内容,填写相应信息
title=soup.find(‘span’,class_=’title-content-title’).text
print(title)#获取网页内容代码
检查——单击小按钮——在页面点击你想要的数据——的到class
选中它,就会最终到如下图所示
第三步:保存数据
在原有代码下增加
#翻开一个空白的txt,然后运用调用write函数写入刚刚的字符串
withopen(‘text_test.txt’,’a+’)asf:
f.write(title)
运转之后得到
不过在编辑器里翻开无法辨认中文,所以到相应方位用记事本或写字板等其他软件翻开即可检查数据。
数据就保存到了该文件里。
第一个简略的爬虫就编写好了。

python

python爬虫速度

一、提升爬虫速度
提示爬虫速度主要有3种办法:
多线程爬虫
多进程爬虫
多协程爬虫
二、并发与并行、同步和异步
并发是指在一个时间段内产生若干事情的情况。
并行是指在同一个时刻产生若干事情的情况。
当运用单核CPU时,多个工作使命便是以并发的办法运转的,由于只有一个CPU时,各个使命会分别占用CPU的一段时间依次履行。这种情况下,各个使命的时间段很短、经常切换,所以咱们会感觉是“一起”进行,其实不是的。在运用多核CPU时,各个核的使命能够一起进行,这才是真实的一起运转,便是并行。
类似于要完成吃完一碗米饭和一碗小炒肉的使命。“并发”是一个人吃,这个人吃一口菜然后吃一口饭,由于切换的很快,会感觉是“一起”吃菜和饭;“并行”便是两个人一起吃,一个人吃饭,另一个人吃菜。
同步便是并发或许并行的各个使命不是独立运转的,使命之间有必定的替换次序,可能在运转完一个使命得到成果后,另一个使命才会开端运转。就好比接力赛跑,要拿到交接棒之后下个选手才干够开端跑。
异步是并发或许并行的各个使命能够独立运转,一个使命的运转不受另一个使命的影响,使命直接就像跑步比赛的各个选手在不同的赛道比赛一样,跑步的速度不受其他赛道选手的影响。
三、多线程爬虫
多线程爬虫是以并发的办法履行的。也便是并不能真实的一起履行,而是通过进程的快速切换加速网络爬虫的速度。
Python中的GIL(GlobalInterpreterLock,全局解释器锁),一个线程的履行进程包含获取GIL、履行代码直到挂起和开释GIL。而且Python进程中,只有一个GIL,拿不到GIL的线程就能允许进入CPU履行。
每次开释GIL时,线程之间会进行锁竞赛,而切换线程会耗费资源。由于GIL的存在,Python中一个进程永久只能一起履行一个线程(拿到GIL的线程),这便是多核CPU上Python的多线程功率不高的原因。
Python的多线程对于IO密集型代码比较友好,网络爬虫能够在获取网页的进程中运用多线程,从而加速速度。
比如,多线程的办法抓取1000个网页,并开启5个线程:
importthreading
importrequests
importtime
importqueueasQueue
link_list=[]
withopen(‘alexa.txt’,’r’,)asfile:
file_list=file.readlines()
foreachoneinfile_list:
link=eachone.split(‘\t’)[1]
link=link.replace(‘\n’,””)
link_list.append(link)
start=time.time()
classmyThread(threading.Thread):
def__init__(self,name,q):
super(myThread,self).__init__()
self.name=name
self.q=q
defrun(self):
print(‘Starting’+self.name)
whileTrue:
try:
crawler(self.name,self.q)
except:
break
print(‘Exiting’+self.name)
defcrawler(threadName,q):
url=q.get(timeout=2)
try:
r=requests.get(url,timeout=20)
print(threadName,r.status_code)
exceptExceptionase:
print(threadName,’Error’,e)
threadList=[‘Thread-1′,’Thread-2′,’Thread-3′,’Thread-4′,’Thread-5’]
workQueue=Queue.Queue(1000)
threads=[]
fortNameinthreadList:
thread=myThread(tName,workQueue)
thread.start()
threads.append(thread)
forurlinlink_list:
workQueue.put(url)
fortinthreads:
t.join()
end=time.time()
print(‘简略多线程爬虫的总时间为:’,end-start)
print(‘ExitingMainThread’)
运用行列的办法,能够加速线程的运用率。
四、多进程爬虫
多进程爬虫能够运用CPU的多核,进程数取决于计算机CPU的处理器个数。由于运转在不同的核上,各个进程的运转是并行的。在Python中,如果咱们要用多进程,需要用multiprocessing这个库。
运用multiprocessing的两种办法:
Process+Queue
Pool+Queue
当进程数量大于CPU的内核数量时,等候运转的进程会比及其他进程运转完毕让出内核为止。所以,单核CPU是无法进行多进程并行的。
Process+Queue
比如1:运用3个进程,抓取1000个网页:
frommultiprocessingimportProcess,Queue
importtime
importrequests
link_list=[]
withopen(‘alexa.txt’,’r’)asfile:
file_list=file.readlines()
foreachoneinfile_list:
link=eachone.split(‘\t’)[1]
link=link.replace(‘\n’,”)
link_list.append(link)
start=time.time()
classMyProcess(Process):
def__init__(self,q):
super(MyProcess,self).__init__()
self.q=q
defrun(self):
print(‘Starting’,self.pid)
whilenotself.q.empty():
crawler(self.q)
print(‘Exiting’,self.pid)
defcrawler(q):
url=q.get(timeout=2)
try:
r=requests.get(url,timeout=2)
print(q.qsize(),r.status_code,url)
exceptExceptionase:
print(q.qsize(),url,’Error:’,e)
if__name__==’__main__’:
ProcessNames=[‘Process-1′,’Process-2′,’Process-3’]
workQueue=Queue(1000)
forurlinlink_list:
workQueue.put(url)
foriinrange(0,3):
p=MyProcess(workQueue)
p.daemon=True
p.start()
p.join()
end=time.time()
print(‘Process+Queue:’,end-start)
print(‘MainprocessEnded!’)
上述代码中,p.daemon=True,每个进程都能够单独设置它的属性,设置为True时,当父进程完毕后,子进程就会自动被停止。
Pool+Queue
当被操作目标数目不大时,能够直接运用上述办法进行动态生成多个进程,但是如果进程数量许多,手动设置进程数量太麻烦,运用pool进程池能够提高功率。
pool能够供给指定数量的进程供用户调用。
堵塞和非堵塞关注的是程序在等候调用成果时回来的状况。堵塞要比及回调成果出来,在有成果之前,当前进程会被挂起。非堵塞为增加进程后,不必定非要比及成果出来就能够增加其他进程运转。
比如2:运用pool+process的办法,抓取1000个网页:
frommultiprocessingimportPool,Manager
importtime
importrequests
link_list=[]
withopen(‘alexa.txt’,’r’)asfile:
file_list=file.readlines()
foreachoneinfile_list:
link=eachone.split(‘\t’)[1]
link=link.replace(‘\n’,”)
link_list.append(link)
start=time.time()
defcrawler(q,index):
Process_id=’Process-‘+str(index)
whilenotq.empty():
url=q.get(timeout=2)
try:
r=requests.get(url,timeout=20)
print(Process_id,q.qsize(),r.status_code,url)
exceptExceptionase:
print(Process_id,q.qsize(),url,’Errpr’,e)
if__name__==’__main__’:
manager=Manager()
workQueue=manager.Queue(1000)
forurlinlink_list:
workQueue.put(url)
pool=Pool(processes=3)
foriinrange(4):
pool.apply_async(crawler,args=(workQueue,i))
print(‘Startedprocess’)
pool.close()
pool.join()
end=time.time()
print(‘Pool+Queue:’,end-start)
print(‘MainprocessEnded!’)
Queue的运用办法就需要改变,这里用到multiprocessing中的Manager,运用manager=Manager()和workQueue=manager.Queue(1000)来创建行列。这个行列目标能够在父进程与子进程间通信。
运用pool.apply_async(target=func,args=(args))完成。
五、多协程爬虫
协程是一种用户态的轻量级线程,运用协程有许多好处:
协程像一种在程序等级模拟体系等级的进程,由于是单线程而且少了上下文切换,因此相对来说体系耗费很少。
协程方便切换控制流,简化了编程模型。协程能保存上一次调用时的状况,每次进程重入时,就相当于进入了上一次调用的状况。
协程的高扩展性和高并发性,一个CPU支撑上万协程都不是问题,所以很适合用于高并发处理。
协程也有缺点:
协程的实质是一个单线程,不能一起运用单个CPU的多核,需要和进程合作才干运转在多核CPU上。
长时间的堵塞的IO操作时不要用协程,由于可能会堵塞整个程序。

未经允许不得转载:IT技术网站 » 网络爬虫python(python爬虫速度)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

志在指尖 用双手敲打未来

登录/注册IT技术大全

热门IT技术

C#基础入门   SQL server数据库   系统SEO学习教程   WordPress小技巧   WordPress插件   脚本与源码下载