专栏/多线程网络爬虫,提高爬虫效率实战——榛果民宿网络爬虫

多线程网络爬虫,提高爬虫效率实战——榛果民宿网络爬虫

2019年08月19日 04:59--浏览 · --喜欢 · --评论
Terrell-_-l
粉丝:247文章:10

上一节说讲到了基础的网络爬虫,全国300多个城市,每个城市爬取需要3分钟,总耗时要900多分钟,就是十多个小时,效率很低。这一次,笔者会讲解多线程网络爬虫的操作流程,原来10多个小时的任务,在多线程的运作下,16分钟就能搞定。

废话不多说,上代码:

#导入库
import requests
import re
import os
from multiprocessing.dummy import Pool as ThreadPool

#这个模块的作用是抓取网页源代码,也就是你在浏览器中单击鼠标右键中查看源代码出现的内容
def getHTMLText(url):
 try:
  kv={'user-agent':'Mozilla/5.0'} #模拟头文件,相当于用假冒的身份证骗过网站的门卫
  r = requests.get(url, timeout=30,headers=kv) #抓取网页源代码
  r.raise_for_status() #查看状态
  r.encoding = r.apparent_encoding #自动识别并更改编码方式
  return r.text #爬下来的源代码保存在内存中的r.text中
 except:
  return ""

#这个模块的作用是通过榛果民宿首页源代码,获取全国所有城市的名字,为后面分城市抓取数据做铺垫
def getLoc(lst,page):
 try:
  r=getHTMLText(page) #抓取首页源代码
  elt=re.findall('<li><a href="/(.*?)/" class="btn btn-default">',r) #找到所有城市对应的拼音简称
  clt=re.findall('class="btn btn-default">(.*?)</a></li>',r)  #找到所有城市对应的中文简称
#将中英文简称填入lst表中,方便之后留用
  for i in range(len(elt)):
   eng=elt[i]
   chn=clt[i]
   lst.append([eng,chn])
 except:
  print("")

#页面解析,每个城市对应的源代码被抓取后,在这里进行解析
def parsePage(ilt, html):
 try:
  plt = re.findall('</i>([\d]*)</span>',html) #找到抓取源代码中的所有价格信息
  alt = re.findall('<span class="room-prop">(.*?)</span></div><div',html) #找打抓取源代码中的所有位置区域信息
#将位置和价格信息导入到ilt表中
  for i in range(len(plt)): 
   price = plt[i]
   area = alt[i].split('</span><span class="room-prop">')[-1]
   ilt.append([price , area])
 except:
  print("")

#将结果打印到屏幕上,以查看是否爬取成功
def printGoodsList(ilt):
 tplt = "{:4}\t{:8}\t{:16}"
 print(tplt.format("序号", "价格", "区域"))  #画出表头
 count = 0
 for g in ilt: #将存储到ilt中的价格和区域数据逐行打印到屏幕上
  count = count + 1
  print(count),
  print(g[0]),
  print(g[1])


#并行爬取模块,将300个地址作为多线程元素,进行爬取。
def mufunc(lt):
 loc = lt[0] #地址拼音
 depth=60 #爬取深度
 begin=20191021 #入住时间
 end=20191022 #离店时间
 start_url = 'https://www.zhenguo.com/' + loc + '/'  #网址
 infoList = [] #构造一个空表,用于保存信息
 for i in range(depth): #一页一页地进行数据爬取
  try:   
   i=i+1
   url = start_url+"pn"+str(i)+"/?dateBegin="+str(begin)+"&dateEnd="+str(end) #最终网址
   html = getHTMLText(url) #网址访问,爬取源代码
   parsePage(infoList, html) #网址信息解析,提取价格和区域信息
  except:
   continue
 printGoodsList(infoList) #将结果打印到屏幕上
 f=open(lt[1]+'.txt','w') #将结果输出到本地文件中
 for k in infoList:
  for m in k:
    m=m.encode('utf-8')
    print>>f,m,
  print>>f,'\n'
 f.close()

 
#指挥官登场
def main():
 page="https://www.zhenguo.com/" #首页网址,也称初始网址
 lst=[] #用于保存城市中文和拼音信息的空表
 getLoc(lst,page)  #从首页获取所有城市的拼音和中文信息,保存至lst中
 pool = ThreadPool(20) #设置并行的线程数,这里为20线程
 pool.map(mufunc,[k for k in lst]) #启动每个线程,开始进行数据爬取


#启动指挥官
main()

接下来的事,你们千万别惊讶,你会发现你的cpu疯转,你的网速飞快,你屏幕上的信息飞速显示出来,不到16分钟,你的桌面上就会出现满满的300多个城市的榛果民宿文档。这,就是并行爬虫的魅力

接下来的事,你们千万别惊讶,你会发现你的cpu疯转,你的网速飞快,你屏幕上的信息飞速显示出来,不到16分钟,你的桌面上就会出现满满的300多个城市的榛果民宿文档。这,就是并行爬虫的魅力接下来的事,你们千万别惊讶,你会发现你的cpu疯转,你的网速飞快,你屏幕上的信息飞速显示出来,不到16分钟,你的桌面上就会出现满满的300多个城市的榛果民宿文档。这,就是并行爬虫的魅力接下来的事,你们千万别惊讶,你会发现你的cpu疯转,你的网速飞快,你屏幕上的信息飞速显示出来,不到16分钟,你的桌面上就会出现满满的300多个城市的榛果民宿文档。这,就是并行爬虫的魅力


视频请移步视频区观看

下面看结果:几秒钟,便生成了十几个文件,可见并行爬虫的效率之高。


投诉或建议

天下网标王黄南企业网站设计威海百度网站优化排名哪家好内江网站关键词优化推荐金华外贸网站制作公司苏州网站关键词优化公司太原企业网站设计林芝seo排名多少钱百色seo网站推广文山网页制作推荐厦门企业网站设计哪家好济南网页制作价格营口网站定制哪家好荷坳优秀网站设计报价泸州网站制作设计公司赤峰网站优化软件哪家好湘西网页设计价格昆明网站改版多少钱阿坝百姓网标王推广多少钱仙桃百度标王报价鸡西网络推广陇南网页设计价格广元网站推广工具哪家好湘潭至尊标王价格大理网站优化按天扣费公司保定网站推广工具报价通化网站开发公司昌吉关键词排名价格坪山网站优化哪家好宿州网站建设设计哪家好朝阳百度竞价包年推广多少钱香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化