python爬虫第五天
2024-10-19 00:25:02
cookie
我们访问网页是通过http协议进行的,而http协议是一个无状态协议(无法维持会话之间的状态),比如我们登录一个网站成功后访问另一个网页,那么登录状态就会消失,十分不方便。而我们可以通过Cookie保存会话信息,将会话信息保存在客户端,或者用session保存会话信息在服务器端。但是服务器端会给客户端发送sessionID等信息,这些信息一般保存在Cookie中,大部分时候我们都要用到Cookie,而爬虫中我们可以通过Cookie保持登录状态进行内容爬取。
Cookiejar实战精析
注意:python3中使用Cookiejar库进行处理,而在python2中可以使用Cookielib库进行处理。
现在我们登录ChinaUnix论坛,http://bbs.chinaunix.net
我们先注册一下,然后我们可以通过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网络爬虫》(韦玮著)的总结,纯手打。
最新文章
- Math.abs(~2018),掌握规律即可!
- jQuery自动加载更多程序
- SharePoint配置搜索服务和指定搜索范围
- groovyConsole — the Groovy Swing console
- [转] Android开发者必备的42个链接
- Oracle多个服务各代表什么作用(转)
- 通过SessionID和用户名来保证同一个用户不能同时登录(单点登录)
- showdialog窗体不在任务栏显示的问题处理
- 用MATLAB实现字符串分割
- JS window对象的top、parent、opener含义
- Bootstrap3 formテキストフィールド横幅の指定の仕方
- IOS的UITextField,UIButton,UIWebView它描述的一些属性和IOS提示图像资源
- SpringMVC之数据传递一
- python之属性描述符与属性查找规则
- MySQL优化的一些基础
- [转]Spark 踩坑记:数据库(Hbase+Mysql)
- NoSQL——not onlySQL不仅仅是SQL
- zabbix的日常监控-API
- js学习笔记30----对象
- array_diff 不注意的坑