爬虫学习01_爬虫基础与requests模块

HTTP和HTTPS

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

HTTPS # HTTPS比HTTP更安全,但是性能更低
HTTP + SSL(安全套接字层)
默认端口号:443

爬虫

  • 爬虫是模拟浏览器发送请求,获取响应

爬虫的流程

  • url -->发送请求,获取响应 -->提取数据/提取url -->保存

url形式 -> scheme://host[:port#]/path/…/[?query-string][#anchor]

页面上的数据在哪里

  1. 当前url地址对应的响应中

  2. 其他的url地址对应的响应中

    • 比如ajax请求中
  3. js生成的数据

    • 部分数据在响应中
    • 全部通过js生成
浏览器渲染出来的页面和爬虫请求的页面并不一样

爬虫只获取当前url地址对应的响应,不会进一步获取js的响应

而当前url地址的elements的内容和url的响应不一样

常用请求头

Host                -> (主机和端口号)
Connection          -> (链接类型)
Upgrade-Insecure-Requests   -> (升级为HTTPS请求)
User-Agent          -> (浏览器名称)***
Accept              -> (传输文件类型)
Referer             -> (页面跳转源)
Accept-Encoding     -> (文件编解码格式)
Cookie              -> (Cookie)***
x-requested-with :XMLHttpRequest  -> (是Ajax 异步请求)

响应状态码(status code)

200:成功
302:重定向,临时转移至新的url
307:重定向,临时转移至新的url
404:not found
500:服务器内部错误

Robots协议(道德层面约束)

网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。

例如:https://www.taobao.com/robots.txt

requests模块

import requests
response = requests.get(url)

中文文档 API

response的常用方法:

response.text           -> 类型:str, 根据HTTP 头部标明的代码自动解码,可能出错
respones.content        -> 类型:bytes, 修改编码response.content.deocde(“utf8”)
response.status_code        -> 状态码
response.request.headers    -> 响应头
response.headers            -> 请求头
response.url            -> 请求的url
response.request.url    -> 响应的url

response = requests.get(url,headers=headers)   # 发送带header的请求
response = requests.get(url,params=kw)         # 发送带?=参数的请求
response = requests.post("http://www.baidu.com/", data = data,headers=headers)  # 发送带POST的请求
    url = "..."
    headers = {'User-Agent':'...',...}
    data = {...}

requests中解决编解码的方法

response.content.decode()     # 默认utf-8,大多数情况下推荐
response.content.decode("gbk")

response.encoding=”gbk”
response.text

# 更推荐使用response.content.deocde()的方式获取响应的html页面

判断请求否是成功

assert response.status_code==200

不要刚正面,手机版一般比电脑版的需要的数据更少

使用代理ip

proxies = { 
    "http": "http://12.34.56.79:9527",          # proxies={协议:协议+ip+端口}
    "https": "https://12.34.56.79:9527", 
    }

requests.get("http://www.baidu.com", proxies = proxies)

正向代理和反向代理的区别

  • 正向代理:客户端知道最终服务器的地址
  • 反向代理:客户端不知道最终服务器的地址

随机代理IP池

准备一堆的ip地址,组成ip池,随机选择一个ip来时用

如何随机选择代理ip,让使用次数较少的ip地址有更大的可能性被用到

- {"ip":ip,"times":0}
- [{},{},{},{},{}],对这个ip的列表进行排序,按照使用次数进行排序
- 选择使用次数较少的10个ip,从中随机选择一个

检查ip的可用性

- 可以使用requests添加超时参数,判断ip地址的质量
- 在线代理ip质量检测的网站

发送携带cookie请求

携带一堆cookie进行请求,把cookie组成cookie池

  • 不需要cookie的时候尽量不去使用cookie

获取登录后的页面的三种方式

  1. requests.session

    1. 实例化session(session具有的方法和requests一样)
      session = requests.session()
    2. session发送请求post请求,对方服务器设置的cookie会保存在session
      session.post(url,data=data,headers=headers)
    3. session请求登录后能够访问的页面,session能够自动的携带登录成功时保存在其中的cookie
      response = session.get(url,headers)
  2. cookie放在headers中
    headers = {"Cookie":"cookie字符串"}

  3. cookie转化为字典放在请求方法中
    requests.get(url,cookies={"name的值":"values的值"})

使用现有的cookie获取登录后的页面的限制

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

字典推导式,列表推导式

cookies="anonymid=j3jxk555-nrn0wh; _r01_=1; _ga=GA1.2.1274811859.1497951251; "
cookies = {i.split("=")[0]:i.split("=")[1] for i in cookies.split("; ")}
[self.url_temp.format(i * 50) for i in range(1000)]

chrome分析url与json

寻找网页中post的url地址

  1. form表单的action属性

  2. 抓包,寻找js的url地址

    • 勾选perserve log按钮,防止页面跳转找不到url
    • 寻找post数据,确定参数
      • 参数不会变,直接用,比如密码不是动态加密的时候
      • 参数会变
        • 参数在当前的响应中
        • 通过js生成

定位想要的js

  1. 选择会触发js时间的标签,点击event listener,找到js的位置
  2. 通过chrome中的search all file来搜索url中关键字
  3. 添加断点的方式来查看js的操作,通过python来进行同样的操作

request小技巧

  1. reqeusts.utils

     requests.get(url,cookies={})
     reqeusts.utils.dict_from_cookiejar      # 把cookie对象转化为字典
     reqeusts.utils.cookiejar_from_dict      # 把cookie字典转化为对象
     requests.utils.quote("...")             # url编码
     requests.utils.unquote("...")           # url解码
    
  2. 忽略SSL证书验证
    response = requests.get("https://www.12306.cn/mormhweb/", verify=False)

  3. 设置请求超时时间
    response = requests.get(url,timeout=10)

  4. 配合状态码判断是否请求成功
    assert response.status_code == 200

  5. retrying模块

     @retry(stop_max_attempt_number=3)       # 通过装饰器使用
     def fun1():
       ...
    

安装第三方模块的三种方法

  1. pip install retrying
  2. 下载源码解码,进入解压后的目录,执行py文件
  3. ***.whl文件安装方法 pip install ***.whl

代理神器Fiddler

抓包工具

Fiddler是一款强大Web调试工具,它能记录所有客户端和服务器的HTTP,HTTPS请求

posted @ 2020-07-04 16:43  Jerome12138  阅读(179)  评论(0编辑  收藏  举报