requests爬虫
获取response
import request
request.get(url=url, headers={
"User-Agent":"Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1"})
解析数据
from lxml import etree
item = {}
html = etree.HTML(response.text)
title = html.xpath('//h4//text()')
if title:
item['title'] = title[0]
deail_url = html.xpath('//h4/a/@href')
if detail_url:
item["url"] = url[0]
登录并存储cookie
import requests
sess = requests.Session()
# 提交用户名密码数据登录并记录cookie, 不进行安全忽略证书(https)
response = sess.post(url, data=login_data, headers=headers, verify=False)
response = sess.get(link, headers=headers)
常见问题
- 使用隧道类型的代理,不能处理需要重定向的url请求, 应直接请求目标url
屏蔽HTTPS警告
在配置文件或启动文件头部运行以下代码
# 版本一
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
# 版本二
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
SSLError解决
from requests_toolbelt import SSLAdapter
adapter = SSLAdapter('TLSv1')
s = requests.Session() # 每次请求添加
s.mount('https://', adapter)
post请求参数
post请求的数据参数有两种
data={dict}
json='str’或者{dict}
如果在post请求头声明了
‘content-type’: ‘application/json’
则且使用json={dict}
则后台使用request.json()直接得到{dict}
如果在headers中声明了
“content-type”: “application/x-www-form-urlencoded”
则只能用json传递字符串
字符串是通过url编码的{dict}
import urllib.parse
data = {k: urllib.parse.unquote(v) if "%" in v else v for k, v in data.items()}
u = urllib.parse.urlencode(data)
在编码之前英注意查看是否有已经编码的字段, 否则会二次编码导致数据错误
使用socks5代理
proxy = 'socks5://ip:port'
proxies = {'http': proxy, 'https': proxy}
resp = requests.get(url, proxies=proxies, ...)
出现异常先升级一下socks
pip install -U requests[socks]
br算法解压缩
content = brotli.decompress(resp.content)
text = content.decode(“utf-8”)
解决304缓存问题
请求头中设置
'If-None-Natch': '',
'If-Modified-Since': '',
requests.exceptions.ProxyError问题
os.environ['NO_PROXY'] = 'stackoverflow.com'