前言
就上一节遗留的问题,我们首先来讲述一下,如何用多个用户代理来避免服务端的反爬,从而得到自己想要的数据,这就是用户代理池。
一、用户代理池(User-Agent)
定义:
为了绕过网站的限制和识别,Python用户代理池是一种用于发送HTTP请求的工具。用户代理是浏览器发送给网站的信息,它包含了浏览器的类型、版本号和操作系统等信息。网站可以根据用户代理来判断请求的来源以及采取相应的措施。
Python用户代理池可以根据需要提供不同的用户代理,使得每个请求都能使用不同的代理,从而增加请求的匿名性和稳定性。用户代理池可以使用已有的代理列表,也可以自动获取和验证新的代理,保证代理的可用性。
功能:
- 代理获取:从代理网站、API或代理池中获取代理。
- 代理验证:验证代理的可用性和有效性,排除无效的代理。
- 代理选择:根据需要从代理池中选择可用的代理进行请求。
- 代理轮换:使用多个代理进行请求,防止被网站封禁。
- 代理管理:维护代理列表,包括添加、删除、更新等操作。
使用场景
:在短时间内连续访问同一个网站很多次。
注意如果使用一个用户代理在短时间内进行多次访问的话,很有可能就会被网站判断为是一个爬虫,从而禁止访问,
解决办法:
- User-Agnet池:可以理解为是一个列表,很多的headers值
- 每一次请求都随机从User-Agnet取一个值
使用Python用户代理池可以提高爬虫的稳定性和效率,并且可以避免被网站封禁。同时,也要注意使用代理时要遵守网站的使用规则,不要滥用代理或进行非法操作。
用户代理池的获取
:可以直接从网站上进行搜索一些,然后自己构建一个富含用户代理池的库并保存,方便后续的使用。
import random
# 简单演示如何使用User-Agent池
user_agent_list = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60'
]
UA = random.choice(user_agent_list) # 从列表中随机获得一个
headers_ = {'User-Agent': UA}
之后再数据爬取的过程中就可以使用这个创建的用户代理池。
import UAS
if __name__ == '__main__':
url_ = 'https://www.xxxxx.com/'
headers_ = UAS.headers
# 每次请求携带上随机的User-Agent
response_ = requests.get(url_, headers=headers_)
print('服务器所检测到的代理身份:', response_.request.headers)
二、url传参
URL传参是通过URL地址将参数传递给服务器的一种方式。一般情况下,URL传参的格式为:?参数名1=参数值1&参数名2=参数值2&参数名3=参数值3…
我们拿一个百度网页的例子来说明:
url携带参数的体现:只携带了美食参数
https://www.sogou.com/web?
query=%E7%BE%8E%E9%A3%9F 只有这个参数是比较有用的,这个就是我们输入的参数‘美食’,可以解码得到我们能看得懂的数据。
&_asf=www.sogou.com&_ast=
&w=01019900&p=40040100&ie=utf8
&from=index-nologin&s_from=index
&sut=3169&sst0=1710328171631&lkt=7%2C1710328168462%2C1710328168990
&sugsuv=1710328150384682&sugtime=1710328171631
1.url传参第一种,直接替换
代码如下(示例):
import requests
if __name__ == '__main__':
input_wd = input('请输入你想要搜索的关键字:')
# 1. 确认目标url
url_ = f'https://www.sogou.com/web?query={input_wd}&_asf=www.sogou.com&_ast=&w=01015002&p=40040100&ie=utf8&from=index-nologin&s_from=index&oq=&ri=0&sourceid=sugg&suguuid=22bd9f74-841d-485f-a68a-cdd9b443d126&stj=0%3B15%3B0%3B0&stj2=0&stj0=0&stj1=15&hp=174&hp1=&suglabid=suglabId_1&sut=2558&sst0=1710335716372&lkt=7%2C1710335713815%2C1710335714390&sugsuv=1710328150384682&sugtime=1710335716372'
2.url传参第二种,利参数(params)进行传值
代码如下(示例):
if __name__ == '__main__':
input_wd = input('请输入你想要搜索的关键字:')
# 1. 确认目标url
url_ = f'https://www.sogou.com/web?'
params_ = {
'query': input_wd
}
response_ = requests.get(url_, headers=headers_, params = params_)
- 使用urllib.parse模块的urlencode函数:
from urllib.parse import urlencode
params = {
'param1': 'value1',
'param2': 'value2'
}
url = 'http://example.com?' + urlencode(params)
无论使用哪种方式,最终生成的URL都会包含参数名和对应的参数值,以问号(?)开始,参数之间使用与号(&)分隔。
在服务器端接收URL传参时,可以根据请求的方式(GET或POST)来获取参数。对于GET请求,可以通过request.args来获取参数;对于POST请求,可以通过request.form来获取参数。
注意,URL传参是将参数暴露在URL中,因此慎重处理敏感信息,避免泄露。对于包含敏感信息的参数,建议使用POST请求,并将参数放在请求体中,而不是直接暴露在URL中。
总结
使用爬虫时我们应遵守以下原则:
- 尊重网站的爬取规则:不应对反爬虫措施进行绕过或者攻击,也不应对网站造成过大的访问负载。
- 确认是否有爬取权限:在爬取数据之前,应该检查网站是否提供了公开的API或者是否有明确的爬取政策。如果没有,需要获得网站的授权或者得到明确的许可。
- 爬取速率控制:为了避免对网站的访问压力过大,应该合理控制爬取的速率。可以设置适当的延时,或者使用请求队列等技术来控制并发访问。
- 合法使用抓取的数据:在爬取到数据后,只能在合法范围内使用抓取的数据, 不得用于商业目的或违法活动。此外,应该尊重数据的所有权和版权,如果需要使用数据,应该事先获得相应的授权或许可。
- 不干扰网站正常运行:在爬取网站数据时,应尽量减少对网站的干扰,不要对网站进行过多的请求或者对网站进行不必要的操作,以免影响网站的正常运行。
既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。 —— 康德