前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:在Scrapy中如何拼接URL Query参数?

一日一技:在Scrapy中如何拼接URL Query参数?

作者头像
青南
发布2023-09-11 16:23:58
3550
发布2023-09-11 16:23:58
举报
文章被收录于专栏:未闻Code未闻Code

我们知道,在使用Requests发起GET请求时,可以通过params参数来传递URL参数,让Requests在背后帮你把URL拼接完整。例如下面这段代码:

代码语言:javascript
复制
# 实际需要请求的url参数为:
# https://www.kingname.info/article?id=1&doc=2&xx=3

import requests

params = {
 'id': '1',
 'doc': '2',
 'xx': '3'
}

requests.get('https://www.kingname.info/article', params=params)

那么在Scrapy中,发起GET请求时,应该怎么写才能实现这种效果呢?

我知道很多同学是通过字符串的format操作来拼接URL的:

代码语言:javascript
复制
url_template = 'https://www.kingname.info/article?id={id}&doc={doc}&xx={xx}'
params = {
 'id': '1',
 'doc': '2',
 'xx': '3'
}

url = url_template.format(**params)

但实际上,Scrapy的FormRequest不仅能用来发起POST请求,还可以在GET请求的时候用来拼接参数。它的写法为:

代码语言:javascript
复制
params = {
 'id': '1',
 'doc': '2',
 'xx': '3'
}

yield scrapy.FormRequest('https://www.kingname.info/article', formdata=params, method='GET')

这只是一个小技巧。大家可以自由选择是使用这种方法还是使用字符串的format填充。

不过话说回来,我想起以前遇到过一个网站,他们的反爬虫方法非常巧妙。

在正常情况下URL的参数顺序是没有任何关系的,什么顺序都可以。但这个网站反爬虫的机制,其中一个环节会判断这些参数在URL中的顺序。例如写成https://www.kingname.info/article?id=1&doc=2&xx=3就一切正常,但写成https://www.kingname.info/article?doc=2&id=1&xx=3就无法访问。当我们无论使用Requests的params参数,还是使用Scrapy的FormRequest参数,它自动组装的参数一般都是字典序,会按参数的首字母顺序排序。但这个网站需要的参数顺序刚好不是字典序,于是网站就会发现你。

END

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档