最详细爬虫零基础教程04——url传参


前言

就上一节遗留的问题,我们首先来讲述一下,如何用多个用户代理来避免服务端的反爬,从而得到自己想要的数据,这就是用户代理池。


一、用户代理池(User-Agent)

定义:为了绕过网站的限制和识别,Python用户代理池是一种用于发送HTTP请求的工具。用户代理是浏览器发送给网站的信息,它包含了浏览器的类型、版本号和操作系统等信息。网站可以根据用户代理来判断请求的来源以及采取相应的措施。

Python用户代理池可以根据需要提供不同的用户代理,使得每个请求都能使用不同的代理,从而增加请求的匿名性和稳定性。用户代理池可以使用已有的代理列表,也可以自动获取和验证新的代理,保证代理的可用性。

功能:

  1. 代理获取:从代理网站、API或代理池中获取代理。
  2. 代理验证:验证代理的可用性和有效性,排除无效的代理。
  3. 代理选择:根据需要从代理池中选择可用的代理进行请求。
  4. 代理轮换:使用多个代理进行请求,防止被网站封禁。
  5. 代理管理:维护代理列表,包括添加、删除、更新等操作。

使用场景:在短时间内连续访问同一个网站很多次。
注意如果使用一个用户代理在短时间内进行多次访问的话,很有可能就会被网站判断为是一个爬虫,从而禁止访问,

解决办法:

  1. User-Agnet池:可以理解为是一个列表,很多的headers值
  2. 每一次请求都随机从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_)
  1. 使用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中。


总结

使用爬虫时我们应遵守以下原则:

  1. 尊重网站的爬取规则:不应对反爬虫措施进行绕过或者攻击,也不应对网站造成过大的访问负载。
  2. 确认是否有爬取权限:在爬取数据之前,应该检查网站是否提供了公开的API或者是否有明确的爬取政策。如果没有,需要获得网站的授权或者得到明确的许可。
  3. 爬取速率控制:为了避免对网站的访问压力过大,应该合理控制爬取的速率。可以设置适当的延时,或者使用请求队列等技术来控制并发访问。
  4. 合法使用抓取的数据:在爬取到数据后,只能在合法范围内使用抓取的数据, 不得用于商业目的或违法活动。此外,应该尊重数据的所有权和版权,如果需要使用数据,应该事先获得相应的授权或许可。
  5. 不干扰网站正常运行:在爬取网站数据时,应尽量减少对网站的干扰,不要对网站进行过多的请求或者对网站进行不必要的操作,以免影响网站的正常运行。

既然我已经踏上这条道路,那么,任何东西都不应妨碍我沿着这条路走下去。 —— 康德

  • 45
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莘薪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值