Python爬虫

request高级用法
  1. --维持会话--

    • 主要是在登录过程中使用该功能(session = request.Session()
  2. --阻塞与非阻塞--

    1. 阻塞:程序会等待一个结果出现(不出现就一直等待)然后才执行其他的代码
      • 造成的问题:requests模块是阻塞的,发出请求会等待响应回来(若不回来,则一直等待),对于单次影响不大,若多次请求的话,时间过长
      • 解决方案:
        1. 多线程
        2. 多进程
          • GIL---->全局解释器锁
        3. 协程
        4. 异步
          • scarpy框架就是异步的,效率很高
  3. --IP池--

    1. 存放IP的文件或者数据库
      • 作用:不可避免IP代理失效问题,代理的筛选、检测、去掉无用的代理,提供给爬虫程序
    2. IP代理网站:
      • 免费:站大爷、西刺网
      • 收费:蘑菇代理、阿布云、快代理、代理云、豌豆代理
      • 爬虫一般是收费的、稳定的IP代理
    3. 设计IP池
      1. 有IP来源(免费、收费)
      2. 筛选、检测IP的可用性
      3. 良好的接口供程序使用
  4. --逻辑、分组、引用--

    1. 分组:
      1. 一个正则可能有多个括号,可以通过数括号来进行分组数量的统计
      2. group()取出第几组
        1. 0--取出全部的结果
        2. 1--取出第一组结果
        3. 2--取出第二组结果
    2. 反向引用
      1. 引用捕获到的东西

        1. 用法:\number number为捕获到的数据的分组编号

        示例:

# --- coding: utf-8 ---d
import re
# 引用5次 分组1捕获到的结果
pattern='135(\d)\\1{5}(.-)'
string='13588888865'

r=re.search(pattern,string)
print(r)
D:\Python\Python3.7\python3.exe "E:/Other Document/Py_Project/Python3_proj/Pachong/逻辑分组引用.py"
<re.Match object; span=(0, 11), match='13588888865'>
Process finished with exit code 0

  1. --re模块的使用--
    1. ---re.search(pattern、string、flages)只匹配一次
    2. ---re.match(pattern、string、flages)匹配字符串开头,并且只匹配一次
    3. ---re.findall(pattern、string、flages)匹配所有的结果,返回结果为列表形式,若没有匹配到,则返回空列表 注意:反转列表:[::-1]
    4. ---re.finditer(pattern、string、flages)findall()相似,只是结果返回结果是个迭代器iterator,需要遍历
    5. ---re.split(pattern、string,maxsplit,flages), maxsplit:要切割的次数,默认0,表示全部切割
    6. flages参数的使用
      1. re.I-->无视大小写 大小写都可以匹配
      2. re.S-->使“.”能够匹配换行符
string='asd3fasdfJava8hih'
pattern='df(.-?)8'      #匹配以df开头,以8结尾的里面额所有的内容(除了换行符),并提取出来
result=re.findall(pattern,string)
print(result)
D:\Python\Python3.7\python3.exe "E:/Other Document/Py_Project/Python3_proj/Pachong/逻辑分组引用.py"
Java
Process finished with exit code 0
  1. --对象式的--
    1. object = re.compile('正则规则')-->较高效
    2. object = search(string、flages)

--常见动态页面分类--

  1. Javascript:用户访问网站-->服务器--->文件(JS)-->浏览器--->先(运算)执行脚本(加密)-->结果渲染浏览器渲染-->显示出来
    • 爬虫顺序:
      1. 先解密JS
      2. 得到参数
      3. 用于get/post等请求
  2. jQuery
  3. Ajax
  4. DHTML:Dinamic HTML 动态的html,将html、css、javascript整合在一起

动态页面处理方法

  1. 解密(JS)反写 (效率不高)
    1. 使用Python模块 execjs 执行JS脚本,可以利用模块执行别人写的脚本
    2. PyV8 引擎 (Python2)
  2. 抓包
    1. 找参数,若参数没有加密,直接爬虫
    2. 若参数加密,解密JS
  3. Selenium
    1. 不解密,不用抓包,不用知道是get还是post,直接控制浏览器,在浏览器中打开,只要浏览器可以访问,爬虫就可以成功。
      • 优点:反反爬虫能力强
      • 缺点:速度慢、消耗计算机资源大、阻塞式的
        1. 多线程
        2. 多进程
        3. Splash (类似Selenium Docker容器)异步式的
        4. 分布式

Selenium

  1. 自动化测试工具

  2. 类似--按键精灵--,反复执行编写的命令

  3. 模拟浏览器访问网站

  4. 操作浏览器,浏览器会对(JS、Ajax、jQuery)进行渲染,选然后的数据可以用Selenium直接获取

    数据的提取:
    1. find_element_by_xpath():driver.find_element_by_xpath()
上一篇:Linux shell 中的括号用法 ()[]{}


下一篇:Nutch源码