python - 无法修改现有逻辑以解析下一页的标题
问题描述
我使用 requests 模块在 python 中创建了一个脚本,以便titles
在启动搜索时填充不同的项目duckduckgo.com
。我的搜索关键字是cricket。我的脚本完美地解析titles
了第一页的内容。
我在解析titles
下一页时遇到了麻烦,因为 的two fields
越来越params
奇怪,如's': '0'
和'dc': '-27'
。但是,其余字段是静态的。
要从第一页解析titles
,我尝试如下(工作):
import requests
from bs4 import BeautifulSoup
URL = "https://duckduckgo.com/html/"
params = {
'q': 'python',
's': '0',
'nextParams': '',
'v': 'l',
'o': 'json',
'dc': '-27',
'api': 'd.js',
'kl': 'us-en'
}
resp = requests.post(URL,data=params,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(resp.text,"lxml")
for title in soup.select(".result__body .result__a"):
print(title.text)
参数的两个字段正在增加,如下所示:
第 1 页:
's': '0'
'dc': '-27'
第 2 页:
's': '30'
'dc': '27'
第三页:
's': '80'
'dc': '76'
第四页:
's': '130'
'dc': '126'
我怎样才能从下一页刮掉标题?
解决方案
下一页的参数每次都保存在 POST 响应中
import requests
from bs4 import BeautifulSoup
URL = "https://duckduckgo.com/html/"
params = {
'q': 'python',
's': '0',
'nextParams': '',
'v': 'l',
'o': 'json',
'dc': '0',
'api': 'd.js',
'kl': 'us-en'
}
with requests.Session() as s:
while True:
resp = s.post(URL,data=params,headers={"User-Agent":"Mozilla/5.0"})
soup = BeautifulSoup(resp.text,"lxml")
for title in soup.select(".result__body .result__a"):
print(title.text)
for i in soup.select('form:not(.header__form) [type=hidden]'): #updated params based on response
params[i['name']] = i['value']
if not soup.select_one('[value=Next]'):
break
推荐阅读
- android - Android 登录到服务器
- gradle - gradle 找不到 flatDirs 文件
- flutter - 值更改时如何在 Flutter 上重绘小部件?
- android - 如何在android中以编程方式设置android:id?
- java - 问题可能是由于守护程序配置不正确引起的
- shopify - 如何通过购物车在结帐页面上显示额外的订单信息?
- java - 线程“main”中的异常 java.lang.NoClassDefFoundError: io/cucumber/messages/Messages$Envelope
- css - Tailwind css 优先级
- asp.net-mvc - 作为 Razor 类库的独立 Blazor 应用
- python - 我试图使用 fit 函数拟合模型,但它导致 None Type Attribute 错误