HTTP 爬虫

参考自:
https://www.nczonline.net/blog/2009/05/05/http-cookies-explained/

https://bubkoo.com/2014/04/21/http-cookies-explained/

前言:

爬虫通过模仿浏览器向服务器发送请求来获取信息,一般是通过修改发送请求中的header信息,如User agent, 请求头,以及Cookie信息。搜索引擎即把网络上的文本取下来并按照文档结构解析。

一般传入一个inital URL,获取当前url响应,并对响应内容进行分析,从其中提取未访问过的其他链接,同时把已访问过的链接进行记录,防止重复访问或者根据要爬取的网站规律构建url list或通过请求及响应分析url变化条件,获取响应,对响应进行处理,数据提取。

*浏览器与爬虫区别:
浏览器访问url时,一般会有cookie,以及完备的请求头,而其收到的响应也是包含elements所有内容(页面内容+css+js+图片等)
爬虫访问url时,则需要对请求及响应进行处理,有时还需考虑页面内容会不断更新的情况。爬虫一般提取数据进行后续分析或将其呈现在网页或者app上。

背景知识:

*URL包括请求的协议,网站域名,资源路径以及参数信息。

*HTTP/HTTPS:
HTTPS = HTTP + SSL, HTTP所有的数据都是明文传输的。
Connection: keep-alive建立长连接,复用最开始的连接,避免三次握手
User_agent: 若要模拟手机版,对应可将user_agent改为手机版

*Cookied: 存储用户信息,每次请求都会被携带上发送给对方浏览器。比如要获取登录后才能访问的页面需要cookie,而对方服务器会通过cookie来判断我们是否是一个爬虫,响应时服务器也可以在响应头进行set-cookie,具体可以从Cookie里查看请求及响应的key=value值。

*GET/POST: get请求没有请求体,其把数据放到url地址里,post请求常用于登录注册或传输大文本的时候,例如翻译数据

Python requests使用

关于requests可介绍可以参考这里

>>> import requests
>>> r = requests.get('https://api.github.com/events')
>>> r.text
编码
  1. 一般情况,requests会自动解码服务器的内容,会基于HTTP头部对响应的编码作出有根据的推测。
  2. 可以通过r.encoding获取文本的编码,并且对其进行赋值,指定编码格式
    对于HTTP和XML等可以自身指定编码的,应使用r.content找到编码,然后设置r.encoding为相应的编码
    *r.content 与 r.text的区别,text返回相应的unicode编码,content返回响应的字节bytes编码,利用r.content.decode()可进行解码,将响应二进制编码转化为str类型。故content可获取图片,音乐等非文本格式
请求
  1. 要检查请求是否成功,可以使用r.raise_for_status()或检查r.status_code是否和你的期望相同。
  2. 定制请求头,可使用字典,但注意存在代理或重定向等情况,header会被覆盖或删除。Requests不会基于定制header的具体情况改变自己的行为。
>>> url = 'https://api.github.com/some/endpoint'
>>> headers = {'user-agent': 'my-app/0.0.1'}

>>> r = requests.get(url, headers=headers)
响应
  1. 使用post方法,传入字典参数或者甚至可以上传多编码的文件,设置文件类型及请求头
>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}

>>> r = requests.post(url, files=files)
  1. 可以使用r.headers来以字典的形式展示服务器的响应头
    r.header['content-type']访问特定的字段
    r.request.headers 获取响应对应的请求头
    r.url 获取响应对应的url
    r.request.url 发送请求的url地址
Cookie
  1. 通过session, 保持会话,从而会保持服务器设置的cookie。
session = requests.session() #session具有的方法与request一致
session.post(url,data,headers) #服务器设置的cookie保存在session中
session.get(url)#会带上之前保存在session中的cookie

发送post请求,再查看响应的cookie值,可以使用r.cookie['cookie名称']

  1. 在请求中发送cookie可将cookie赋值放到headers里,也可以先创建cookie字典,例如cookie = dict(cookie_name=cookie_value), 然后在request.get(url, cookies=cookies)
    cookie的返回对象为RequestsCookie,可通过get方法对其设置
模拟GET/POST

模拟浏览器发送GET, response = requests.get(url,headers=headers)
模拟浏览器发送POST,response = requests.post(url, data=data, headers=headers)
一般headers需要加入User-Agent, Referer,Cookie等

超时参数

requests.get(url,headers=headers,timeout=3) 3s后无响应报错

你可能感兴趣的:(HTTP 爬虫)