• 爬虫学习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请求

  • 相关阅读:
    NTP时间同步
    《暗时间》
    寻找字典公共键
    maven pom.xml的execution报错
    maven安装scala插件
    html 和xml
    sparkstreaming+kafka
    zookeeper错误Error contacting service. It is probably not running.
    eclipse开发hive2程序
    eclipse开发hbase程序
  • 原文地址:https://www.cnblogs.com/JeromeLong/p/13235565.html
Copyright © 2020-2023  润新知