python - 无法修改现有逻辑来解析下一页的标题

标签 python python-3.x web-scraping

我使用 requests 模块在 python 中创建了一个脚本,以获取在 duckduckgo.com 中启动搜索时填充的不同项目的 titles。我的搜索关键字是板球。我的脚本正在完美地解析第一页的 titles

Website address

我在解析下一页的titles时遇到麻烦,因为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)

参数的两个字段正在增加,如下所示:

第一页:

's': '0'
'dc': '-27'

第二页:

'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

关于python - 无法修改现有逻辑来解析下一页的标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57232557/

相关文章:

python - 减少字典列表的优雅方法?

python - 从下拉列表中的选定选项中抓取响应

vba - 宏使用 serverxmlhttp 请求获取部分响应

python - 尝试在模拟水穿过细胞膜的运动中实现菲克第一扩散定律

python - Pandas 更改默认的 numpy 数组格式

python-3.x - python 中的转义序列给出错误的结果

python - 从交互式图表中抓取数据

python - python 中使用coverage.py 的代码覆盖率

python - 了解 concurrent.futures.Executor.map()

python-3.x - 训练多个 Keras NN 模型时出现段错误(核心转储)