爬虫的概念
- 模拟浏览器发送请求,获取响应
爬虫的流程
- url—》发送请求,获取响应—》提取数据—》保存
- 发送请求,获取响应—》提取url(下一页,详情页)重新请求
爬虫要根据当前url地址对应的响应为准
- 爬虫只会请求当前这个url,但是不是请求js,
- 浏览器拿到的内容,我们在浏览器中看到的内容是elements里面的内容
- elements=url对应的响应+js+css+图片
requests模块如何发送请求
- resposne = requests.get(url)
requests中解决编解码的方法
- response.content.decode()
- response.content.decode(“gbk”)
- response.text
判断请求否是成功
assert response.status_code==200
url编码
https://www.baidu.com/s?ie=UTF-8&wd=%E6%9F%A5%E7%9C%8B%E6%88%91%E7%9A%84%E8%AF%B7%E6%B1%82%E5%A4%B4
- https://www.baidu.com/s?ie=UTF-8&wd=查看我的请求头
- 解码工具百度即可
字符串格式化的另一种方式
"查看{}请求头".format("我的")
使用代理ip
-
准备一堆的ip地址,组成ip池,随机选择一个ip来时用
-
如何随机选择代理ip,让使用次数较少的ip地址有更大的可能性被用到
- {“ip”:ip,“times”:0}
- [{},{},{},{},{}],对这个ip的列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个ip,从中随机选择一个
-
检查ip的可用性
- 可以使用requests添加超时参数,判断ip地址的质量
- 在线代理ip质量检测的网站
携带cookie请求
- 携带一堆cookie进行请求,把cookie组成cookie池
使用requests提供的session类来请求登陆之后的网站的思路
- 实例化session
- 先使用session发送请求,登录对网站,把cookie保存在session中
- 再使用session请求登陆之后才能访问的网站,session能够自动的携带登录成功时保存在其中的cookie,进行请求
不发送post请求,使用cookie获取登录后的页面
- cookie过期时间很长的网站
- 在cookie过期之前能够拿到所有的数据,比较麻烦
- 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面
字典推导式,列表推到是
cookies="anonymid=j3jxk555-nrn0wh; _r01_=1; _ga=GA1.2.1274811859.1497951251; _de=BF09EE3A28DED52E6B65F6A4705D973F1383380866D39FF5; ln_uact=mr_mao_hacker@163.com; depovince=BJ; jebecookies=54f5d0fd-9299-4bb4-801c-eefa4fd3012b|||||; JSESSIONID=abcI6TfWH4N4t_aWJnvdw; ick_login=4be198ce-1f9c-4eab-971d-48abfda70a50; p=0cbee3304bce1ede82a56e901916d0949; first_login_flag=1; ln_hurl=http://hdn.xnimg.cn/photos/hdn421/20171230/1635/main_JQzq_ae7b0000a8791986.jpg; t=79bdd322e760beae79c0b511b8c92a6b9; societyguester=79bdd322e760beae79c0b511b8c92a6b9; id=327550029; xnsid=2ac9a5d8; loginfrom=syshome; ch_id=10016; wp_fold=0"
cookies = {i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
[self.url_temp.format(i * 50) for i in range(1000)]
获取登录后的页面的三种方式
- 实例化session,使用session发送post请求,在使用他获取登陆后的页面
- headers中添加cookie键,值为cookie字符串
- 在请求方法中添加cookies参数,接收字典形式的cookie。字典形式的cookie中的键是cookie的name对应的值,值是cookie的value对应的值
requests如何获取响应的url地址和请求的url地址,如何发送post请求
- response.url
- response.request.url
- requests.post(url,data={})
如何发送带headers的请求和params的请求
- requests.get(url,headers={})
- requests.get(url,params = {})
如何使用代理,正向代理和反向代理的区别
- requests.get(url,proxies={协议:协议+ip+端口})
- 正向代理:客户端知道最终服务器的地址
- 反向代理:客户端不知道最终服务器的地址
模拟登陆的三种方式
-
session
- 实例化session(session具有的方法和requests一样)
- session发送请求post请求,对方服务器设置的cookie会保存在session
- session请求登录后能够访问的页面
-
cookie放在headers中
- headers = {“Cookie”:“cookie字符串”}
-
cookie转化为字典放在请求方法中
- requests.get(url,cookies={“name的值”:“values的值”})
寻找登录的post地址
-
在form表单中寻找action对应的url地址
- post的数据是input标签中name的值作为键,真正的用户名密码作为值的字典,post的url地址就是action对应的url地址
-
抓包,寻找登录的url地址
- 勾选perserve log按钮,防止页面跳转找不到url
- 寻找post数据,确定参数
- 参数不会变,直接用,比如密码不是动态加密的时候
- 参数会变
- 参数在当前的响应中
- 通过js生成
定位想要的js
- 选择会触发js时间的按钮,点击event listener,找到js的位置
- 通过chrome中的search all file来搜索url中关键字
- 添加断点的方式来查看js的操作,通过python来进行同样的操作
安装第三方模块
- pip install retrying
- 下载源码解码,进入解压后的目录,
python setup.py install
***.whl
安装方法pip install ***.whl
json使用注意点
- json中的字符串都是双引号引起来的
- 如果不是双引号
- eval:能实现简单的字符串和python类型的转化
- replace:把单引号替换为双引号
- 如果不是双引号
- 往一个文件中写入多个json串,不再是一个json串,不能直接读取
- 一行写一个json串,按照行来读取