requests模块的学习
使用前
- pip install request
发送get, post请求,获取响应
- response = requests.get(url)
- response = requests.post(url, data = {请求体的字典})
response的方法
-
response.text
– 往往出现乱码,出现乱码时在前面加一句:response.encoding = “utf-8” -
response.content.decode()
– 把响应的二进制流转化为str类型(实际上是一个json字符串) -
response.request.url #发送请求的URL地址
-
response.url #response响应的URL地址
-
response.request.headers #请求头
-
response.headers #响应请求
获取网页源码的正确方式
(依次尝试以下三种方法,一定有一个可以正确获取解码后的字符串)
- response.content.decode()
- response.content.decode(“gbk”)
- response.text
发送header请求
- 为了模拟浏览器,不被服务器阻拦,获取和浏览器一模一样的内容
headers = { "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36", "Referer":"https://www.baidu.com/"} response = requests.get(url, headers=headers)
使用超时参数
- request.get(url, headers=headers, timeout=3) #3秒之内必须返回响应,否则报错
retrying模块的学习
pip install retrying
from retrying import retry headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"} @retry(stop_max_attempt_number=3) #反复执行3次,都报错才会报错 def _parse_url(url): print("*"*100) response = requests.get(url, headers=headers, timeout=5) return response.content.decode()
处理cookie相关的请求
- 直接携带cookie请求url地址
- cookie放在headers中
headers = {"User-Agent":"......", "Cookie":"......"}
- cookie字典传给cookies参数
requests.get(url,cookies=cookie_dict)
- cookie放在headers中
- 先发送post请求,获取cookie,再上cookie请求登录后的页面
session = requests.session() #实例化session。session具有的方法和cookie一样 session.post(url,data,headers) #发送post请求,执行的同时session自动保存了服务器在本地设置的cookie session.get(url) #会带上之前保存的cookie
数据提取方法
json
-
一个看起来像python类型(列表,字典)的字符串
-
哪里会返回json数据:
- 浏览器切换到手机版
- 抓包app
-
json.loads
- 把看起来像python类型的json字符串转化为真正的python类型
json.loads(json字符串)
(返回的即是字典类型)
-
json.dumps
- 把python类型转化为json字符串
json.dumps({ "a" : "a" , "b" : 2})
json.dumps(ret,ensure_ascii=False, indent=2)
- ensure_ascii : 让编码的中文显示为中文
- indent:能够让下一行在上一行的基础上添加空格
xpath和lxml
-
xpath
- 一门从html中提取数据的语言
-
xpath语法
- xpath helper插件:帮助我们从
elements
中定位数据 - 选择节点/标签
/html/head/meta
:能够选中html下的head下一级的所有meta标签//li
:当前页面上所有的li标签/html/head//link
:能够选中head下所有级的所有link标签- @:定位
//div[@class='aaaa']/ul/li
:选择class=aaaa的div下的ul下的li标签/a/@href
:选择a标签下href的值
/a/text()
:获取a标签下的文本/a//text()
:获取a标签下的所有文本./a
:当前结点下的a标签
- xpath helper插件:帮助我们从
-
lxml
- 获取html字符串
- 安装:pip install lxml
- 使用
from lxml import etree element = etree.HTML("html字符串") element.xpath("xpath语法")
一些常用的基础知识点
- format:字符串格式化的一种方式
"吃{}个苹果".format(1)
"吃{}个苹果".format([1,2,3])
"吃{}个苹果".format({1,2,3})
"吃{}个苹果和{}个梨".format({1,2,3}, [1,2,3])
"吃{}个苹果和{}个梨".format({1,2,3}, 1)
- 列表推导式
- 帮助我们快速的生成包含一堆数据的列表
[i+10 for i in range(10)]
----->[10,11,12…19]
["1月{}日".format(i) for i in range(1,10)]
----->[“1月1日”,“1月2日”…“1月9日”]
- 帮助我们快速的生成包含一堆数据的列表
- 字典推导式
- 帮助我们快速的生成包含一堆数据的字典
{i+10:i for i in range(10)}
----->{10:0, 11:1,12:2…19:9}
{"a{}".format(i):10 for i in range(3)}
----->{“a0”:10, “a1”:10, “a2”:10}
- 帮助我们快速的生成包含一堆数据的字典
- 三元运算符
result = a if 表达式 else b
表达式成立取a,否则取b
代码书写
- url
- 知道url地址的规律和总页数:构造url地址的列表
- start_url
- 发送请求,获取响应
- requests
- 提取数据
- 返回json字符串:json模块
- 返回的是html字符串:lxml模块配合xpath提取数据
- 保存数据