爬虫

概念:网络爬虫(又被称为网页蜘蛛,网络机器人),一中按照一定规则抓取网络信息的程序

原理:模拟客户端发送请求,接收请求响应

一、爬虫分类

  1. 通用爬虫:一般指搜索引擎的爬虫

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

二、爬虫的流程

1、聚焦爬虫的工作流程

1.1 聚焦爬虫的工作流程图:

   graph TD
   A[url list] -->B[响应内容]
   B-->D[提取数据]
   B-->C[提取url]
   C-->A
   D-->E[入库]

1.2 搜索引擎工作流程图

   graph TD
   抓取网页数据-->数据存储-->预处理-->提供检索服务

1.3 浏览器的请求过程

  浏览器获取的数据包含: url地址对应的响应 +js+CSs+jpg

  爬虫会获取:url地址对应的响应

  爬虫获取的内容和elements内容不一样,进行数据提取的时候,需要根据url地址对应的响应为准

1.4 robots协议(身份标识)

robots协议:网站通过robots协议告诉搜索引擎那些网页可以抓取,那些不能,但仅仅是道德层面的约束

1.5 requests发送简单请求

  1. response = requests.请求方法(url)

    response的常用方法:

    response.text

    response.content:响应类型

    response.status_code:响应状态码

    response.request.heades:请求头

    response.headers:响应头

  2. 判断请求是否成功:assert response.status_code==200

  3. 发送get带参请求:参数形式为字典,用法:requests.get(url,params={})

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

    1
    "xxx{}xxx".format(1)
  5. 发送post请求——用法:response = requests.post(url,data=字典 ,headers=headers)

1.6使用代理

1、 用法:requests.请求方法(url,proxies=字典)

proxies = {"http": "", "https": ""}

可创建一个代理ip池提高速度

2、分类:
1)透明代理

REMOTE_ADDR = Proxy IP

HTTP_VIA = proxy IP

http_X_FORWARDED_FOR = You IP

2)匿名代理

REMOTE_ADDR = Proxy IP

HTTP_VIA = proxy IP

http_X_FORWARDED_FOR = You IP

3)混淆代理

REMOTE_ADDR = Proxy IP

HTTP_VIA = proxy IP

http_X_FORWARDED_FOR = Random IP address

4)高匿代理

REMOTE_ADDR = Proxy IP

HTTP_VIA = not determined

http_X_FORWARDED_FOR = not determined

1.7 coke和session

区别:

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上
  2. cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗。
  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能。
  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

优点:

带上cookie和session能够请求登录后的网页

弊端:一套cookie和session往往和一个用户对应,请求太快次数太多容易被服务器识别为爬虫

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

1. session处理cookie相关请求
  1. request提供session来实现客户端和服务端进行会话保持

    会话保持的内涵:

      1)保存cookie

      2)实现服务端长链接

    1. 使用方法

        session = request.session()

        response = session.get(url, headers)

2.cookies处理cookie相关请求
  1. cookies的形式:字典

    1
    cookies = {"cookie":"value"}
  2. 使用方法:

    1
    request.get(url,headers=hearder,cookies=cookie_dicr)
  3. 使用已有cookie生成cookie字典

    1
    cookie_dict = {i.split("=")[0]:i.split("=")[1] for i in cookie.split(";")}
  4. cookie里有用的是name和value

      可以使用request.utils.dict_from_cookiejar:将cookie转为字典

    1
    cookies = request.utiles.dict_from_cookiejar(cookie)
  5. ssl 证书验证错误:

    • 返回错误信息内容:ssl.CertificateError...

    • 解决:在请求方法中添加参数 verify=False

  6. 超时参数的使用

      在超时后进行强制执行:response =requests.get(url,timeout=3)

    • 可以使用来验证代理ip
  7. retry的使用

    当超时报错时重复执行指定次数后再跳过

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    # coding=utf-8
    import requests
    from retrying import retry
    headers = {}
    @retry(stop_max_attempt_number=3)
    def _parse_url(url):
    print('*'*100)
    response = requests.get(url, headers=headers, timeout=3)
    assert response.status_code == 200
    return response.content.decode()


    def parse_url(url):
    try:
    html_str = _parse_url(url)
    except Exception as e:
    html_str = None
    return html_str


    if __name__ == '__main__':
    url = "www.baidu.com"
    print(parse_url(url))
  8. 多线程爬虫

    使用threading创建多线程

    • threading
      • t1 = threading.Thread(targe=func, args=(,))
      • t1.setDaemon(True) # 守护线程
      • t1.start()
    • 队列
      • q.join() # 阻塞主线程,让主线程等待队列任务结束之后在结束,队列任务在计数为0时
      • q.task_done()和get()方法配合使用队列数-1
      • q.put()队列数+1