• 爬虫理论


    爬虫

    字符串

    字符串分两类:

    1. bytes (二进制形式)
    2. str (unicode形式)

    字符集:
    字符集是多个字符的集合

    • ASCII字符集
    • GB2312字符集
    • GB18030
    • Unicode字符集

    字符集包含了所有需要表示字符.
    ASCII是最早使用最多的字符集, 编码用1个字节表示. 但是表示的字符太少, 只对英文的的表示有良好支持.
    于是其他字符集应需而生.
    Unicode可以用来表示所有语言字符, 编码用2个字节表示. 所以占用空间较大.

    而UTF-8编码, 是Unicode字符集的一种实现方式, 这种实现方式好处在于, 能用1个字节表示的, 就用1个字节表示, 1个字节解决不了才用2个字节表示.
    相对于原本的Unicode解决办法来说, 更节省空间. 所以现在多使用于UTF-8

    Python中

    encode可以将字符串编码为bytes二进制.
    decode可以将字符串解码为 utf8.
    其中 str.decode() 默认为utf-8
    str.decode()
    str.decode("utf-8")
    str.decode("utf8")
    str.decode("UTF-8")
    这几种表达方式没有区别, 不区分大小写, 有无-都可. 甚至如果是utf-8编码的方式,可以省略

    Http和HTTPS协议区别

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

    • https:
      http + ssl (安全套接层:公私钥加解密)
      默认端口443

      更安全, 性能更低

    url形式

    scheme: (方案)协议. 通讯使用的协议: http/https/ftp
    anthor: 锚点. 一般用#号表示. 当请求网址锚点的时候, 直接跳转网址位置到指定锚点. (带锚点与否的请求, 响应内容是相同的. 不过显示位置不同.)

    爬虫分类

    • 通用爬虫: 通常指搜索引擎的爬虫
    • 聚焦爬虫: 需要爬取某些特定网站的爬虫. 通常说爬虫一般指的就是聚焦爬虫

    种子url

    引擎爬虫url的起始点

    网页内容在哪里

    • 当前url对应的响应(response)中.页面源码===> 文字等
    • 其他url对应的响应(response)中===>图片等
    • 比如ajax中
    • js生成的 ===> 动态页面
    • 部分数据在响应当中.
    • 全部通过js生成

    代理IP

    使用代理

    首先需要去代理网找能够使用的免费或者付费ip
    在发送request请求的时候, 设置proxies值.并且设置http,https键, 值为所使用代理ip和端口
    格式:

    import requests
    proxies = {
    	"http":"http://163.113.101.23:80",
    	"https":"https://163.113.101.23:80",
    }
    res = request.get("http://www.baidu.com",proxies=proxies)
    

    IP池

    • 准备相当多供使用的代理IP,随机选择一个使用

    • IP池选择:

    • 字典形式{'ip':'ip','times':0} # 每次使用之后,使用次数+1

    • 列表形式[{'ip':ip},{'ip2':ip2},] # 按照使用次数排序sort

    • 从使用次数较少的N个ip中, 随机选择一个ip

    • 检查可用性

    • 使用requests添加超时参数, 判读ip地址的质量

    • 使用在线ip质量检测网站

    在请求页面的时候, 能不使用cookie就不使用cookie.
    如果需要使用cookie的时候, 要判断. 单一cookie会不会影响访问.
    如果不影响. 则可以通过携带之前cookie来访问.

    会话保持(携带自身cookie)

    • 实例化session
    • 显示用session发送请求, 登录网站. 把cookie保存在session中
    • 再使用session请求登录之后才能访问的网站, session能够自动的携带登录成功时,保存在其中的cookie.进行请求.
    # 实例化一个session对象.
    session = requests.session()
    data = {
    	'帐号':'zhanghao',
    	'密码':'密码'
    }
    # 先获得登录之后的cookie
    session.post(url,data)
    # 即可访问登录之后的地址
    response = session.get(url,headers)
    

    单一会话如果可以长期使用的时候, 也可以直接免去session.post登录帐号密码这个步骤, 直接在data里面添加已经登录过的cookie值. 同样可以进行访问
    如果影响, 则需要准备大量cookie(帐号密码)进行访问

    不需要发送POST登录的情况

    1. cookie过期时间比较久
    2. 单次数据获取, 不需要时常更新的数据.
    3. 配合其他程序一起使用, 其他程序专门获取cookie,当前程序专门请求页面.

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

    • 实例化session, post登录
    • header中添加cookie值
    • 请求方法中添加cookie参数, 键值对应(需split分割).

    如何获取登录的post地址

    1. 再form表单中寻找action对应的url地址
    • post数据是input标签中的name值, value就是对应帐号密码
    1. 抓包
    • 勾选perserve log 按钮, 防止页面跳转找不到对应url(或者直接输入错误密码)
    • 寻找post数据, 确认参数
    • 固定加密的密码: 可直接通过post密码来提交加密后的对应密码来post登录
    • 动态加密密码:
      • 在当前响应中, 寻找
      • 通过js 生成,需要定位js.看如何生成.

    定位想要的js事件

    • 选中绑定js事件的按钮,element listen.
    • 通过search file 来寻找关键字
    • 在chrome中添加断点, 查看js操作, 通过python进行同样的操作.形成同样的加密格式.

    requests

    跳过ssl验证

    在访问某些网站的时候, 没有ssl证书. 则浏览器拦截.
    如果用爬虫访问该网站的时候, 会直接报错
    这个时候请求的时候需要将ssl证书验证关掉.对应参数verify

    requests.get('http://www.baidu.com',verify=False)
    

    设置超时

    requests.get('http://www.baidu.com',timeout=10)
    

    重新请求

    使用第三方模块
    retry
    导入retry之后, 使用retry装饰.


    2020.03

  • 相关阅读:
    codevs1227 方格取数2 注意数组啊啊啊啊啊啊啊啊啊啊
    codevs1033 蚯蚓的游戏问题 裸最小费用最大流,注意要拆点
    模板题 codevs 1993 草地排水 想学习的请看链接
    java初级易错问题总结
    JAVA基本数据类型所占字节数是多少?
    forword和重定向有什么区别?
    Spring框架注解
    hibernate利用mysql的自增张id属性实现自增长id和手动赋值id并存
    eclispe中安装hibernate插件
    struts2使用模型传值
  • 原文地址:https://www.cnblogs.com/jrri/p/12944147.html
Copyright © 2020-2023  润新知