爬虫-requests库

  • 代表重点

爬虫的基本概念

爬虫的定义 *

· 网络爬虫,又称爬虫、网络蜘蛛或网络机器人。就是模拟客户端发送网络请求,接收请求响应,一种按照一定的规则,自动地抓取互联网信息的程序。
· 只要是浏览器能做的事情,原则上爬虫都能做。

爬虫的分类 *

  • 通用爬虫:通常指搜索引擎的爬虫

  • 流程:抓取网页–>数据存储–>预处理–>提供检索服务、网站排名(pagerank算法)

  • 聚焦爬虫:针对特定网站的爬虫

  • 流程:url list–>响应内容–>提取数据–>保存数据
    | |
    |<–提取url

HTTP

  • 超文本传输协议
  • 默认端口号:80

HTTPS

  • HTTP+SSL(安全套接字层)
  • 默认端口号:443

HTTPS比HTTP更安全,但性能更低

ROBOTS协议

  • Robots协议:网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。
  • 例如:https://www.taobao.com/robots.txt

浏览器发送请求的流程

  • 浏览器通过域名请求–>DNS服务器,DNS服务器解析域名返回IP地址–>浏览器再通过IP地址请求对应的网站–>Web服务器,返回html、css、js页面

爬虫要根据当前url地址对应的响应为准,当前的url地址和elements的内容和url的响应不一样 *

  • 因为爬虫只针对当前url地址返回的response内容,而element内容可能通过其他原因进行二次渲染。
  • 原因一:当前url地址对应的响应中
  • 原因二:其他url地址对应的响应中
    • 比如通过ajax请求生成
  • 原因三:js生成
    • 部分数据在响应中
    • 全部通过js生成

url的形式

  • scheme://host[:port#]/path/…/[?query-string][#anchor]
  • scheme:协议,如http、https、ftp
  • host:服务器的ip地址或者域名
  • port:服务器的端口,http默认80,https默认443
  • path:访问资源的路径
  • query-string:参数,发送给http服务器的数据
  • anchor:锚,跳转到网页的指定锚点位置
  • 如:http://localhost:4000/file/part01/1.2.html 或 http://item.jd.com/11936238.html#product-detail

HTTP常见的请求头 *

  • Host:主机和端口号
  • Connection:链接类型
  • Upgrade-Insecure-Requests:升级为HTTPS请求
  • User-Agent:浏览器名称
  • Accept:传输文件类型
  • Referer:页面跳转处
  • Accept-Encoding:文件编解码格式
  • Cookie:存储在浏览器的用户个人信息,安全级别低
  • x-requested-with:XMLHttpRequest Ajax异步请求

GET方法和POST方法有什么区别?

  • 安全性:POST高,GET低
  • 参数位置:POST在请求体,而GET在URL
  • 大小:POST无限制,GET最大1024B即1KB

响应状态码(status code)

  • 200:成功
  • 302:临时转移至新的url
  • 307:临时转移至新的url
  • 404:Not Found
  • 500:服务器内部错误

字符串类型

  • bytes:二进制

    • 互联网上数据的都是以二进制的方式传输的
  • str:unicode的呈现形式

Unicode UTF8 ASCII的补充

  • 字符(Character)是各种文字的符号的总称,包括各国文字、标点符号、图形符号、数字等
  • 字符集(Character set)是多个字符的集合
  • 字符集包括:ASCII字符集、GB2312字符集、GB18030字符集、Unicode字符集等
  • ASCII编码是1一个字节,而Unicode编码通常是2个字节。
  • UTF-8是Unicode的实现方式之一,UTF-8是Unicode的子集,一种变长的编码方式,可以是1,2,3个字节。

str和bytes如何转化

  • str使用encode方法转化为bytes
  • bytes使用decode方法转化为str
  • 编码方式解码方式必须一样,否则就会出现乱码

requests库的基本使用

  • requests库是用来发送请求,获取响应的

发送简单的请求

  • response = requests.get(url)

    判断请求是否成功

    assert response.status_code==200
    

    response的常用方法:

    • response.text
    • response.content
    • response.status_code
    • response.requset.headers
    • response.headers

发送带header的请求

  • 目的:模拟浏览器、欺骗服务器、获取和浏览器一致的内容
  • header的形式:字典
  • headers={“User-Agent”:“Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML, like Gecko)Chrome/54.0.2840.99 Safari/537.36”}
  • 用法:requests.get(url, headers=headers)

发送带参数的请求

  • 参数的形式:字典

  • 如kw={‘wd’:‘python’}

  • 用法:requests.get(url, params=kw)

    url编码

    • https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD

    字符串格式化的另一种方式

    '老{}人与海'.format(1) 
    

Requests深入

发送POST请求

  • 登录注册(POST比GET更安全)

  • 需要传输大文本内容的时候

  • 因此,爬虫也需要在这两个地方模拟浏览器发送post请求

  • 用法:response = requests.post(url,data=data,headers=headers)

  • data的形式:字典

  • sys模块中的sys.argv属性

  • alias模块的运用,需要在bashrc目录下更改

使用代理ip

  • 浏 -->(request) 代 -->(requests)Web
  • 器 <-- (response) 理 <–(response)server
  • 用法:requests.get(url, proxies= proxies)
  • proxies的形式:字典
  • 如proxies= {
    “http”:“http://12.34.56.78:80”,
    “https”:“https://12.34.56.78:443”
    }
  • 目的:让对方服务器以为不是同一个客户端在请求,防止爬虫被发现
  • 准备ip池,随机选择一个ip来使用
  • 如何随机选择代理ip
    • {“ip”:ip, “times”:0}
    • [{},{},{}…],对这个ip的列表进行排序,按照使用次数进行排序
    • 选择使用次数较少的10个ip,从中随机选择一个
  • 检查ip的可用性
    • 可以使用requests添加超时参数,判断ip地址的质量
    • 在线代理ip质量检测的网站

携带cookie请求

  • 目的:让对方服务器以为不是同一个客户端在请求,防止爬虫被发现
  • 如何随机选择cookie
    • {“cookie”:cookie, “times”:0}
    • [{},{},{}…],对这个cookie的列表进行排序,按照使用次数进行排序
    • 选择使用次数较少的10个cookie,从中随机选择一个
  • 准备cookie池,随机选择一个cookie来使用
  • 检查cookie的可用性
    • 可以使用requests添加超时参数,判断cookie的质量
    • cookie质量检测

session请求

  • requests提供了一个叫做session类,来实现客户端和服务器的会话保持
  • 用法:session = requests.session()
    response = session.get(url,headers)

cookie和session的区别

  • cookie数据存放在客户端浏览器上,session数据放在服务器上
  • cookie安全性低,别人可以分析存放在本地的cookie并进行cookie欺骗
  • session数据存放在服务器上,安全性高,但一般会有过期时间
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie

爬虫处理cookie和session

  • 能够请求登录后的页面
  • 若请求太快太多,容易被服务器识别为爬虫
  • 在不需要cookie的时候尽量不去使用cookie

使用requests提供的session类请求登录之后的网站的思路

  • 实例化session
  • 先使用session发送请求,登录网站把cookie保存在session中
  • 再使用session请求登录之后才能访问的网站,session能够自动的携带登录的cookie进行请求

不发送POST请求,使用cookie获取登录后的页面

  • cookie过期时间很长的网站
  • 在cookie过期之前能够拿到所有的数据
  • 配合其他程序一起使用,其他程序专门获取cookie,当前程序专门请求页面

字典推导式,列表推导式

cookies = "a=1; b=2; c=3; d=4"
cookies = {i.split("=")[0], i.split("=")[1] for i in cookies.split("; ")}
[self.url_temp.format(i * 50) for i in range(6)]

获取登录后的三种方式

  • 实例化session,使用session发送post请求,再使用session获取登录后的页面
  • headers中添加cookie键,值为cookie字符串
  • 在请求中添加cookies参数,接收字典形式的cookie,字典形式的cookie中的键是cookie的name对应的值,值是cookie的value对应的值

requests与urllib

  • requests的底层实现就是urllib
  • requests在python2和python3中通用,方法完全一样
  • requests简单易用
  • requests能够自动帮助我们解压(gzip压缩的等)网页内容
  • requests中文文档:http://docs.python-requests.org/zh_CN/latest/index.html

requests中解决编解码的方法

  • response.content.decode()
  • response.content.decode(“gbk”)
  • response.text

寻找登录的post地址

  • 在form表单中寻找action对应的url地址
    • post的数据是input标签中name的值作为键,真正的用户名密码作为值得字典,post的url地址就是action对应的url地址
  • 抓包
    • 勾选perserve log按钮,防止页面跳转找不到url
    • 寻找post数据,确定参数
      • 参数不变,直接使用。如密码不是动态加密的时候
      • 参数会变
        • 参数在当前响应中
        • 通过js生成

定位js

  • 选中带有触发js事件的按钮,点击event listener找到js的位置

  • 通过Chrome中的search all file来搜索url中的关键字

  • 添加断点的方式来查看js的操作,通过python来进行同样的操作

requests小技巧

  • requests.util.dict_from_cookiejar 把cookie对象转化为字典
  • 请求SSL证书验证
    • response = requests.get(“https://www.12306.cn/mormhweb/”, verify=False)
  • 设置超时
    • response = requests.get(url.timeout=10)
  • 配合状态码判断是否请求成功
    • assert response.status_code==200

安装第三方模块

  • pip install
  • 下载源码解码,进入解压后的目录,
    python setup.py install
    
  • ***.whl 安装方法 pip install ***.whl
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值