cookie           我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态就会消失,十分不方便。而我们可以通过Cookie保存会话信息,将会话信息保存在客户端,或者用session保存会话信息在服务器端。但是服务器端会给客户端发送sessionID等信息,这些信息一般保存在Cookie中,大部分时候我们都要用到Cookie,而爬虫中我们可以通过Cookie保持登录状态进行内容爬取。   Cookiejar实战精析     注意:python3中使用Cookiejar库进行处理,而在python2中可以使用Cookielib库进行处理。     现在我们登录ChinaUnix论坛,http://bbs.chinaunix.net http://account.chinaunix.net/login/?url=http%3A%2F%2Fbbs.chinaunix.net%2F   我们先注册一下,然后我们可以通过Fiddler工具进行分析,不过我们现在先使用F12调出调试界面,登录输入用户名密码,点击登录,观察调试界面。在NetWork下找到登录Request URL字段得到POST表单网址 http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes。(书中这样写的,但是现在网页自动跳转了,我没找到。。直接用了书上的可以用。)       import urllib.request import urllib.parse import http.cookiejar #这里填写登录成功的url,这里的loginhash是书上的。这里用肯定不行,这里得在登录页面拿到才行 url="http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes&loginhash=L68q" postdata=urllib.parse.urlencode({     #这里填写用户名密码,自己填自己的吧     "username":"yang",     "password":"1234567890" }).encode('utf-8') req=urllib.request.Request(url,postdata) req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36') #创建CookieJar对象 cjar=http.cookiejar.CookieJar() #使用HTTPCookieProcessor创建cookie处理器,并以其为参数opener为参数 opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar)) #将opener安装为全局 urllib.request.install_opener(opener) file=opener.open(req) data=file.read() file=open("D:/crawler/9.html","wb") file.write(data) file.close() url2="http://bbs.chinaunix.net" data2=urllib.request.urlopen(url2).read() fhandle=open("D:/crawler/10.html","wb") fhandle.write(data2) fhandle.close() 这个代码我还没有弄成功,先放在这里吧。         接下来开始手写爬虫实战   图片爬虫实战         首先我们先实现一个简单的爬虫,我们打开京东首页www.jd.com 进入手机分类商品 http://list.jd.com/list.html?cat=9987,653,655 ,我们点击下一页发现网址变了, http://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=6#J_main   可以发现这里是使用get方法请求的,如何自动爬取其他页的情况呢?我们可以使用for循环每次循环后把page字段加1,即自动切换到下一页,之后我们要获取对应的图片,使用正则表达式匹配源码中的图片的链接部分,然后通过urllib.request.urlretrieve()方法将对应的链接保存在本地。 我们要先过滤点信息走,我们右击查看源代码:我们要找到一个唯一的标识,并且包含要爬取得内容,以及尽量少的无关信息。这里我们找到<div id = "plist"> 这是开头的部分,结尾的标识<div class="page clearfix"满足要求     这样过滤就是:用正则表达式只取这两个标识中间的内容:patl='<div id="plist".+?<div class="page clearfix">'   import re import urllib.request import urllib.error   def craw(url,page):     html1=urllib.request.urlopen(url).read()     html1=str(html1)     pat1='<div id="plist".+?<div class="page clearfix">'     result1=re.compile(pat1).findall(html1)     result1=result1[0]     pat2='<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">'     imagelist=re.compile(pat2).findall(result1)     x=1       for imageurl in imagelist:         imagename="D://crawler/image/image"+str(page)+str(x)+".jpg"         imageurl="http://"+imageurl         try:             urllib.request.urlretrieve(imageurl,filename=imagename)         except urllib.error.URLError as e:             if hasattr(e,"code"):                 x+=1             if hasattr(e,"reason"):                 x+=1         x+=1   for i in range(1,15):     url="http://list.jd.com/list.html?cat=9987,653,655&page="+str(i)     craw(url,i)     这样就爬取成功了,我亲测可以。     今天实在是懒就写这么多了       此文是我在学习《精通Python网络爬虫》(韦玮著)的总结,纯手打。  
扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄