imglist = re.compile(pat).findall(data) for j in range ( 0 , len (imglist)):
try :thisimg = imglist[j] thisimgurl = thisimg+"_1024.jpg" file = "F:/python_workspace/test/pic2/" + str (i)+ str (j)+ ".jpg"
urllib.request.urlretrieve(thisimgurl , filename =file)
print ( " 第 " + str (i)+ " 页第 " + str (j)+ " 个图片爬取成功 " )
except urllib.error. URLError as e:
if hasattr (e , "code" ):
print (e.code) if hasattr (e , "reason" ):
print (e.reason)
except Exception as e:
print (e)
9、抓包分析实战(一)
获取淘宝的评论信息、腾讯的娱乐新闻信息等需要抓包分析。 如何抓取 https 的数据包以及腾讯视频的评论。
TextView:显示返回的信息; 通过 fiddler 找到含有评论的网址,复制出对应的网址,观察网址的规则。
设置完 fiddler 之后,点击要爬取的页面,回到 fiddler 中,确定有 js 内容的链接:
对应的网址为:
https://rate.tmall.com/list_detail_rate.htm?itemId=42679128869&spuId=315119437&sellerId=2166475645&order=3¤tPage=1&append=0&content=1&tagId=&posi=&picture=&ua=098%23E1hv%2FpvEvbQvUvCkvvvvvjiPP2Lw0jEbPL59AjnEPmPZQj1Pn2L9QjEvR2MwljE8vphvC9vhvvCvpvyCvhQvryGvCzox9WFIRfU6pwet9E7rejZIYExr1EuK46en3OkQrEttpR2y%2BnezrmphQRAn3feAOHPIAXcBKFyK2ixrlj7xD7QHYWsUtE97Kphv8vvvvvCvpvvvvvmCc6Cv2UIvvUnvphvpgvvv96CvpCCvvvmCXZCvhhmEvpvV2vvC9jx2uphvmvvv98GEKUM72QhvCvvvMMGtvpvhvvvvv8wCvvpvvUmm3QhvCvvhvvv%3D&isg=AoKCecM7b7NouHNtRCUm6rar0osk--IFkGgfUsyboPWxHyKZtOPWfQjduSCd&needFold=0&_ksTS=1508769919830_1070&callback=jsonp1071
然后确定其中的 itemId 等字段的内容,其中的部分内容未必有用处,可以直接删除,比如 上面 url的 ua 字段。
如果要抓取 https 的数据:
Fiddler 默认只能抓取 HTTP 协议的网页,不能抓取 HTTPS 协议的网页,而我们很多时候,都需要抓 HTTPS 协议的网页,比如抓淘宝数据等。 今天,韦玮老师会为大家讲解如何使用 Fiddler 抓取 HTTPS 协议的网页。
打开 Fiddler,点击“Tools--FiddlerOptions--HTTPS”,把下方的全部勾上,如下图所示:
然后,点击 Action,选择将CA 证书导入到桌面,即第二项,导出后,点击上图的 ok 保存配置。
然后在桌面上就有了导出的证书,如下所示:
随后,我们可以在浏览器中导入该证书。 我们打开火狐浏览器,打开“选项--高级--证书- -导入”,选择桌面上的证书,导入即可。 随后,Fiddler 就可以抓 HTTPS 协议的网页 了。 如下图所示。
抓取腾讯视频的评论: 下图为带评论的 js 文件(从 fiddler 中获取):
其中有多个字段,commentid 等,在点击“加载更多”时,commentID 会发生变化,在第一个url 的源码中会找到下一个评论 url 的地址,找到 last 字段,即为下一个 url 的commentid, 以此来构造下一个 url。
#!/usr/bin/env python # _*_ UTF-8 _*_
import urllib.request import re import urllib.error
headers = ( "User_Agent" , "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" )
opener = urllib.request.build_opener()
opener.addheaders = [headers]
urllib.request.install_opener(opener)
comid = "6323280825454961655"
url = "http://coral.qq.com/article/2102904258/comment?commentid=" +comid+ "&req num=20&tag=&callback=jQuery1124020025941284059412_1508770934137&_=15087 70934145" for i in range ( 0 , 100 ):
data = urllib.request.urlopen(url).read().decode()
patnext = '"last":"(.*?)"' nextid = re.compile(patnext).findall(data)[ 0 ]
patcom = '"content":"(.*?)",'
comdata = re.compile(patcom).findall(data)
for j in range ( 0 , len (comdata)):
print ( "------ 第 " + str (i)+ str (j)+ " 条评论内容是 : " )
print ( eval ( 'u"' +comdata[j]+ '"' ))
url =
"http://coral.qq.com/article/2102904258/comment?commentid=" +nextid+ "&re qnum=20&tag=&callback=jQuery1124020025941284059412_1508770934137&_=1508 770934145"
10、微信爬虫实战:
如何解决微信的限制?
#!/usr/bin/env python # _*_ UTF-8 _*_
#http://weixin.sogou.com/
import re import urllib.request import time import urllib.error
# 自定义函数,功能为使用代理服务器爬一个网址
def use_proxy (proxy_addr , url): # 建立异常处理机制 try :
req = urllib.request.Request(url)
req.add_header( "User_Agent" , "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" )
proxy = urllib.request.ProxyHandler({ 'http' :proxy_addr})
opener = urllib.request.build_opener(proxy , urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data = urllib.request.urlopen(req).read()
return data
except urllib.error.URLError as e:
if hasattr (e , "code" ):
print (e.code) if hasattr (e , "reason" ):
print (e.reason)
# 若为 URLError 异常,延时 10 秒执行 time.sleep( 10 )
except Exception as e:
print ( "exception:" + str (e))
time.sleep( 1 )
# 设置关键词 key = "Python" # 设置代理服务器,该代理服务器有可能失效,读者需要换成新的有效代理服务器 # 即通过 fiddler 中转爬取。 proxy = "127.0.0.1:8888" # 爬多少页 : for i in range ( 0 , 10 ):
key = urllib.request.quote(key)
thispageurl = "http://weixin.sogou.com/weixin?type=2&query=" +key+ "&page" + str (i)
#a="http://blog.csdn.net"
thispagedata = use_proxy(proxy , thispageurl)
print ( len ( str (thispagedata))) pat1 = '
if ( len (rs1)== 0 ):
print ( " 此次 ( " + str (i)+ " 页 )没有成功 " )
continue for j in range ( 0 , len (rs1)):
thisurl = rs1[j]
# 提取到的网址与通过浏览器实际跳转的页面网址不完全一致,通过比 # 较观察发 现,爬取的页面中有 amp 字段为多余。
thisurl = thisurl.replace( "amp;" , "" )
file = "F:/python_workspace/test/wechat/ 第 " + str (i)+ " 页第 " + str (j)+ " 篇文章 .html"
thisdata = use_proxy(proxy , thisurl)
try :
fh = open (file , "wb" )fh.write(thisdata) fh.close()print ( " 第 " + str (i)+ " 页第 " + str (j)+ " 篇文章成功 " )
except Exception as e:
print (e)
print ( " 第 " + str (i)+ " 页第 " + str (j)+ " 篇文章失败 " )
微信爬虫的爬取依然是使用浏览器,即在搜狗浏览器上使用微信网页版,然后编辑这个页面的 url,以获取内容。
11、多线程爬取实战 糗事百科的代码:
#!/usr/bin/env python # _*_ UTF-8 _*_
import urllib.request import re import urllib.error
headers = ( "User_Agent" , "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" )opener = urllib.request.build_opener() opener.addheaders=[headers]
urllib.request.install_opener(opener)
for i in range ( 1 , 2 ): url = "https://www.qiushibaike.com/8hr/page/" + str (i)
pagedata=urllib.request.urlopen(url).read().decode( "utf-8" , "ignore" ) pat= '
.*?(.*?).*?
' datalist = re.compile(pat , re.S).findall(pagedata) for j in range ( 0 , len (datalist)):
print ( " 第 " + str (i)+ " 页第 " + str (j)+ " 个段子的内容是 : " )
print (datalist[j])
将此程序改为多进程为:
#!/usr/bin/env python # _*_ UTF-8 _*_
import urllib.request import re import urllib.error import threading
headers = ( "User_Agent" , "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0" )opener = urllib.request.build_opener() opener.addheaders=[headers]
urllib.request.install_opener(opener)
class One (threading.Thread):
def __init__ ( self ):
threading.Thread. __init__ ( self )
def run ( self ):
for i in range ( 1 , 36 , 2 ):
url = "https://www.qiushibaike.com/8hr/page/" + str (i)
pagedata=urllib.request.urlopen(url).read().decode( "utf- 8" , "ignore" )
pat= '
.*?(.*?).*?
'