python爬虫第六天

2019-12-08
    要求:把一个网页里一切的链接地址提取出来    思路:确认爬取的进口链接         构建提取链接的正则表达式         模仿浏览器爬取网页         依据正则表达式提取链接         过滤掉重复的链接         后续操作   比方咱们来获取   http://blog.csdn.net/下的链接   import re import 凯发k8国际手机urllib.request import urllib.error def getlink:  #模仿浏览器拜访  headers= applewebkit/537.36 chrome/63.0.3239.132 safari/537.36')  opener=urllib.request.build_opener  opener.addheaders=[headers]  #将opener装置成大局  urllib.request.install_opener  file=urllib.request.urlopen  data=str)  #构建正则表达式  pat='";]+\.*)'  #  link=re.compile.findall  #去除重复元素,只需求将link设为set调集再转为list就能够了    link=list)  return link   #要爬获得网页 url="http://blog.csdn.net/" linklist=getlink for link in linklist:  print     获取成功,这儿需求弄懂的是链接的正则表达式,许多当地都有用:";]+\.*)   糗事百科爬虫实战       咱们先来剖析各个网页的网址规则,结构网址变量,经过for循环爬取多页的内容 完成一个自定义函数专门用来爬取某网页的段子,这儿和咱们前次爬取图片差不多 import re import urllib.request import urllib.error def getcontent:  #--------  # 模仿浏览器拜访  headers = applewebkit/537.36 chrome/63.0.3239.132 safari/537.36')  opener = urllib.request.build_opener  opener.addheaders = [headers]  # 将opener装置成大局  urllib.request.install_opener  #---------  data=urllib.request.urlopen.read.decode    #构建对应用户提取的正则表明  userpat='alt="" '  #构建段子内容提取的正则表达式  contentpat=' div /div '  #寻觅一切的用户  userlist=re.compile.findall  #寻觅一切的内容  contentlist=re.compile.findall    x=1  #循环遍历段子内容并赋值  for content in contentlist:  #去除换行  content=content.replace  content = content.replace  content = content.replace  content = content.replace  #用字符串作为变量名,先将对应的字符串赋值给一个变量  name="content"+str  #exec函数完成用字符串作为变量名而且赋值  exec  x+=1  y=1  #遍历用户,输出用户对应内容  for user in userlist:  name="content"+str    print+str+"是:"+user)  print  exec")  print  y+=1  #履行循环获取 for i in range:  url="http://www.qiushibaike.com/text/page/"+str  getcontent     现在这个网站改版了,爬取的内容如同显现不全。网站代码改版,咱们就要替换url和正则表达式,不然爬不到,自己剖析网页结构,做到灵活运用。 现在知道怎么爬取网页范围内的文字,而且自己能给出一些润饰删减就好了。     微信文章爬虫实战     咱们在爬取微信的时分会比较费事,因为咱们的ip会经常被封杀。那么咱们就要处理这个问题。 首要咱们人工进行查阅,再用爬虫自动化。咱们先进入搜狗的查找渠道:http://weixin.sougou.com 输入关键词进行检索:检查url:http://weixin.sogou.com/weixin?type=2 s_from=input query=%e7%89%a9%e8%81%94%e7%bd%91 ie=utf8 _sug_=y _sug_type_= w=01019900 sut=10877 sst0=1548826154871 lkt=1%2c1548826154767%2c1548826154767 咱们剖析一下发现假如没有type字段则查找的不是文章。query是咱们恳求关键词的信息,我输入的关键词是物联网。 咱们点击下一页发现 http://weixin.sogou.com/weixin?query=%e7%89%a9%e8%81%94%e7%bd%91 _sug_type_= sut=10877 lkt=1%2c1548826154767%2c1548826154767 s_from=input _sug_=y type=2 sst0=1548826154871 page=2 ie=utf8 w=01019900 dr=1 page字段呈现了为2,所以是操控页数的字段。接下来咱们结构网址   http://weixin.sogou.com/weixin?query=关键词 type=2 page=页码 咱们接着再调查源代码: div a target="_blank" href="http://mp.weixin.qq.com/s?src=11 amp;timestamp=1548826683 amp;ver=1397 amp;signature=dumruskdf4kb9th4ollcy2f2li51-*rrcb6cxu2xwjtxiekw6y5qx4mcg9xklcv5ezvo8vylv5ku9hqes7h0mraerae8n9leju4c-ik6c1n4ms-pqlaukzvd-3h-b9k2 amp;new=1" id="sogou_vr_11002601_title_0" uigs="article_title_0" data-share="http://weixin.sogou.com/api/share?timestamp=1548826683 signature=qibwy*ni6ku9tbso4vcd8lysesxoyglchx5tlbqlmr8n6fldhs4llcfgrw7fjtaona2v-2x1w7auuzd-vidxm3gvlytfd8sjy6-uegqq2dxx0gpni92wd2h9cr4shlxudn7eea0mg*bje1cgq1sr-p8d6sgbq1vl0s2tjantd0vk-pwsl-vvvo1uywe4yr*hx*phsuyqnabbub185mtr9p4yramvobzgcka2z2uwlzo=" [ em !--red_beg-- 物联网 !--red_end-- /em ]是我国的! em !--red_beg-- 物联网 !--red_end-- /em 年代,且___! /a   得到正则表达式:    ' div .*?"' 这样咱们能够运用相关函数提取出指定页数的文章网址出来 可是咱们拜访的时分发现网址参数过错,这时咱们直接经过列表翻开网址。发现提取出来的网址比实在的网址的多了 amp 咱们能够运用replace将其替代为""即可,关于封ip的状况就要用到咱们之前学习的署理ip   规划一下:咱们要完成三个函数 一个是运用署理服务器爬取指定的网址并回来数据,一个是获取多个页面文章链接的功用,最终一个依据文章链接爬取指定标题和内容。 代码中假如发作反常,咱们就要进行延时处理:运用time.sleep applewebkit/537.36 chrome/63.0.3239.132 safari/537.36') opener = urllib.request.build_opener   opener.addheaders = [headers] # 将opener装置成大局 urllib.request.install_opener # --------- listurl=[]   def use_proxy:  try:  import urllib.request  proxy = urllib.request.proxyhandler  opener = urllib.request.build_opener  urllib.request.install_opener  data = urllib.request.urlopen.read.decode  return data  except urllib.error.urlerror as e:  if hasattr:  print  if hasattr:  print  time.sleep  except exception as e:  print)  time.sleep   def getlisturl:  try:  page=pagestart    keycode=urllib.request.quote  pagecode=urllib.request.quote  for page in range:  url="http://weixin.sogou.com/weixin?type=2 query="+keycode+pagecode+str  #print#这儿的url有点问题如同 #pagecode=urllib.request.quote我不太清楚这儿为什么要编码 #我想改成不编码 #pagecode=urllib.request.quote #url="http://weixin.sogou.com/weixin?type=2 query="+keycode+" "+pagecode+"="+str #可是这儿ip有点问题,看下面  data1=use_proxy #这儿data1输出为none,不知是不是ip不能用的问题  print    listurlpat=' div .*?"'  #print  listurl.append.findall)  print)+"页")  return listurl  except urllib.error.urlerror as e:  if hasattr:  print  if hasattr:  print  time.sleep  except exception as e:  print)  time.sleep   def getcontent:  i=0  html1=''' !doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd" html xmlns="http://www.w3.org/1999/xhtml" head   title 微信文章页面 /title   meta http-equiv="content-type" content="text/html;charset=utf-8" /   /head body '''  fh=open  fh.write)  fh.close    fh=open    for i in range):  for j in range):  try:  url=listurl[i][j]  url=url.replace  data=use_proxy    titlepat=" title /title "  contentpat='id="js_content" id="js_sq_bar"'  title=re.compile.findall  content=re.compile.findall  thistitle="此次没有获取到"  thiscontent="此次没有获取到"  if:  thistitle=title[0]  if:  thiscontent=content[0]  dataall=" p 标题为:"+thistitle+" /p p 内容为:"+thiscontent+" /p  fh.write)  print+"网页第"+str+"次处理")  except urllib.error.urlerror as e:  if hasattr:  print  if hasattr:  print  time.sleep  except exception as e:  print)  time.sleep  fh.close  html2=''' /body /html '''  fh=open  fh.write)  fh.close #设置关键词   key="物联网" #署理ip proxy="27.29.77.113" proxy2="" pagestart=1 pageend=2 listurl=getlisturl   getcontent 这儿要么是署理ip那儿出了问题,换了许多ip仍是衔接不上。可能是url拼接的有点问题,可是我改往后依然有反常, [winerror 10060] 因为衔接方在一段时间后没有正确答复或衔接的主机没有反应,衔接测验失利。 这个弄了一天,还没有处理。。心累。。有大佬看出来过错还请指出来,鄙人谢谢了。 要春节了。。提早祝我们新年快乐哈!       此文是我在学习《通晓python网络爬虫》的总结,纯手打。