上篇
1. requests 请求时设置请求头(重点)
注意:除了设置 User-Agent 请求头,也可以通过 headers 参数设置其他请求头。
2. requests 请求时携带查询参数(重点)
方式1:通过 params 参数设置请求时携带的查询参数:
方式2:将请求时携带的查询参数直接放入 URL 地址中:
3. GET 和 POST 请求的区别(了解)
GET | POST | |
---|---|---|
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或者其他敏感信息的时候决不能使用GET。 | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |
4. 使用代理的目的和代理分类
使用代理的目的:
- 让服务器以为是不同的客户端在请求
- 防止我们的真实地址被泄露,防止被追究
代理的使用过程:
5. requests 模块使用代理的基本语法(重点)
语法格式如下:
response = requests.get(url, proxies={})
proxies 参数接收的数据类型为字典。
字典的格式如下:
proxies = {
"协议类型": "协议类型://代理IP地址:端口号"
}
例如:
proxies = {
# 目标地址为 http 协议,会使用 http 这个 key 对应的代理服务
"http": "http://113.121.255.26:9999",
# 目标地址为 https 协议,会使用 https 这个 key 对应的代理服务
"https": "https://219.151.157.130:3128"
}
6. 案例-使用代理请求唱吧网站(重点)
7. 爬虫中使用 Cookie 的原因
为了能够通过爬虫获取到登录后的页面,或者是解决通过cookie的反爬,需要使用request来处理cookie相关的请求
8. requests 请求携带 Cookie(重点)
方式1:设置 headers 请求头:
方式2:传递 cookies 参数:
下篇
1. requests 携带 Cookie(重点)
方式3:使用 requests.session 发送请求
2. 补充:将 cookie 字符串转换为 Python 字典(了解)
3. 补充:RequestsCookieJar和Python字典的互相转换(了解)
3. requests 处理网站证书错误(重点)
4. requests 设置 timeout 请求超时参数(重点)
5. retrying 重试模块的使用(重点)
基本使用:
结合requests模块重试网络请求:
6. 百度贴吧爬虫案例(重点)
案例需求:
1)给定一个贴吧名字,给定要抓取的页数
2)将贴吧的每一页数据保存到 html 中
页面地址分析:
李毅吧第一页:https://tieba.baidu.com/f?kw=李毅&pn=0
李毅吧第二页:https://tieba.baidu.com/f?kw=李毅&pn=50
李毅吧第三页:https://tieba.baidu.com/f?kw=李毅&pn=100
李毅吧第四页:https://tieba.baidu.com/f?kw=李毅&pn=150
李毅吧第五页:https://tieba.baidu.com/f?kw=李毅&pn=200
...
获取某个贴吧的第n页地址格式:
https://tieba.baidu.com/f?kw=贴吧名称&pn=(n-1)*50
# 步骤分析
# 1)让用户输入贴吧名称和要抓取的页数
# 2)构造出要抓取贴吧页面地址
# 3)遍历向每个地址发送请求,并将响应的内容保存成 html 页面
# 实现
import requests
# 1)让用户输入贴吧名称和要抓取的页数
tb_name = input('请输入贴吧名称:')
pages = int(input('请输入抓取页数:')) # str -> int
# print(tb_name, pages)
# 2)构造出要抓取贴吧页面地址
base_url = 'https://tieba.baidu.com/f?kw={}&pn={}'
# 列表推导式
url_list = [base_url.format(tb_name, i*50) for i in range(pages)]
# print(url_list)
# 3)遍历向每个地址发送请求,并将响应的内容保存成 html 页面
# 准备请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
# enumerate
for i, url in enumerate(url_list):
print('请求第{}页'.format(i+1))
# 发送请求
response = requests.get(url, headers=headers)
# 获取响应内容
html_str = response.content.decode()
# 将响应内容保存成 html 文件
filename = '{}第{}页.html'.format(tb_name, i+1)
with open(filename, 'w', encoding='utf8') as f:
f.write(html_str)
# 设置休眠,防止频率太快被阻止请求
import time
import random
# random.uniform(1, 3):随机产生一个 1-3 范围内的小数
time.sleep(random.uniform(1, 3))
print('文件保存完毕!!!')
7. 数据提取简介
认识xml:
xml 是数据的一种存储形式
<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>
常用的数据提取方法: