1. 爬虫基础requests模块的get请求

1. 基本流程

graph TD
    A[Url-list]-->B[发送请求获取响应]
    B --> C[解析响应]
    C --> |提取数据|D[保存数据]
    C --> A

2. HTTP协议

2.1 爬虫关注的请求头和响应头

请求头

  • User-Agent 浏览器的信息

  • Referer 页面跳转处

  • Cookie 识别用户

  • Host 请求目的地址

  • Connection 保持长连接

  • Upgrade-Insecure-Request 升级安全访问

响应头

Set-Cookie:服务器设置的用户cookie

2.2 常见响应状态码

  • 200:成功
  • 302:跳转,新的url在响应的Location头中给出
  • 303:浏览器对于POST的响应进行重定向至新的url
  • 307:浏览器对于GET的响应重定向至新的url
  • 403:资源不可用;服务器理解客户的请求,但拒绝处理它(没有权限)
  • 404:找不到该页面
  • 500:服务器内部错误
  • 503:服务器由于维护或者负载过重未能应答,在响应中可能可能会携带Retry-After响应头;有可能是因为爬虫频繁访问url,使服务器忽视爬虫的请求,最终返回503响应状态码

所有的状态码都不可信,一切以是否从抓包得到的响应中获取到数据为准

2.3 爬虫和浏览器请求的区别

  • 浏览器会将请求页面的所有相关请求资源请求并渲染
  • 爬虫一次只针对一个所需URL的请求,不会渲染

3. requests模块

3.1 直接URL请求

  • 语法: response = requests.get(url)
  • 代码示例
import requests

url = 'http://www.baidu.com'
response = requests.get(url)

print(response.content.decode())  # 默认utf-8
print(response.url)               # 返回实际请求的URL,有时会不同
print(response.status_code)       # 返回状态码
print(response.headers)           # 返回响应报文的请求头
print(response.request.headers)   # 返回请求者的请求头
print(response.cookies)           # 返回服务端给用户设置的cookie
print(response.request._cookies)  # 返回请求者的cookie

3.2 通过带参数的URL请求

  • 语法: response = requests.get(url, headers= header, params= kw),将参数设为字典传入
  • 代码示例
import requests

url = 'https://cn.bing.com/search?'  # 请求地址

header = {   # 请求头
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"
    }

kw = { 'q' : 'python' }     # 参数通过关键字形式传入

response = requests.get(url, headers= header, params=kw)

with open('request_params.html', 'wb') as f:  # 存入文件中
    f.write(response.content)

3.3 带cookie的header请求

  • 语法:在请求头中添加cookie
  • 代码示例
import requests

url = 'https://github.com/ahang1598'
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36',
    'Cookie': '_octo=GH1.1.33955........'
}
response = requests.get(url, headers= header)

with open('request_without_cookie_github.html', 'wb') as f:
    f.write(response.content)

3.4 cookie的参数请求

  • 语法:将cookie设置为字典,requests.get(url, headers=header, cookies=cookie)
  • 代码示例
import requests

url = 'https://github.com/ahang1598'
header = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36'
}
Cookie='_octo=GH1.1.339554947.1578661733; ...'
cookie_list = Cookie.split('; ')   # 切割生成列表
cookies = {}    
# 1. 通过简单for循环生成
for cookie in cookie_list:
    cookies[ cookie.split('=')[0] ] = cookie.split('=')[1]
# 2. 通过字典生成器
# cookies = { cookie.split('=')[0]:cookie.split('=')[1] for cookie in cookie_list }

response = requests.get(url, headers= header, cookies=cookies)

with open('request_cookie_params.html', 'wb') as f:
    f.write(response.content)

3.5 通过cookiejar提取生成cookies

  • 语法:cookies_dict = requests.utils.dict_from_cookiejar(response.cookies)
  • 代码示例
import requests
...
response = requests.get(url, headers=header)
# 方法三:通过requests中的utils.dict_from_cookiejar方法对response对象提取生成
cookie_dict = requests.utils.dict_from_cookiejar(response.cookies)
print(cookie_dict)

3.6 超时参数timeout

  • 语法:requests.get(url, timeout=3)
  • 作用:防止一直未响应影响性能,3s内未响应则报错,默认10s响应等待时间

3.7 代理proxy

  • 代理基础:
    • 正向代理:客户端知道服务器地址,通过某代理地址访问,而非直接通过本地IP访问
    • 反向代理:客户端不知道服务器地址,通过代理访问,只有代理知道
  • 语法:提前定义proxies, 使用proxies参数
proxies = {
    'http':'http://x.x.x.x:17940',
    'https':'https://x.x.x.x:17940'
}
requests.get(url, proxies= proxies, timeout=5) # 防止代理不可用,等待时间过长

3.8 使用verify参数忽略CA证书检查

  • 语法:requests.get(url, verify=False)
  • 访问测试:https://sam.huat.edu.cn:8443/selfservice/
  • 会有InSecure-Warning但是能继续访问

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