【问题标题】:Python Beautiful Webscraping Simulate Click to Scrape All PagesPython 漂亮的网页抓取模拟点击抓取所有页面
【发布时间】:2021-09-20 17:56:06
【问题描述】:

我在尝试抓取包含 42 页数据的 http://www.o-review.com/database_filter_model.php?table_name=glasses&tag= 时遇到了一个有趣的问题。我能够成功抓取第一页信息,但是在尝试抓取所有页面时,我发现 URL 保持不变,并且使用网站底部的按钮更改页面。

inspector 中的 html 代码如下:

    <div onclick="filter_page('1')" class="filter_nav_button round5" 
    style="cursor:pointer;"><img src="/images/icon_arrow_next.svg"></div>
    

我在抓取和 python 方面非常新,但被告知我需要在 javascript 中模拟“点击”,我完全不知道该怎么做,并且不确定它是否可以被硬编码。到目前为止,我尝试尝试的东西很弱:

    response = get('http://www.o-review.com/database_filter_model.php? 
    table_name=glasses&tag=')
    soup = bs(response.text, 'html.parser')
    print(soup)

    for page in range(1, 42):
        pages = soup.find('div', onclick_ = 'filter_page()')

希望过去有人解决了这个问题。帮助将不胜感激!谢谢!

编辑:这是我要添加的代码:

    ## Find All Frame models
    for find_frames in soup.find_all('a', class_ = 'round5 
    grid_model'):
        # Each iteration grabs child text and prints it
        all_models = find_frames.text
        print(all_models)

这将被添加到注释要添加代码的地方!谢谢!

【问题讨论】:

  • 你没有在页面上循环!你只需遍历range!您必须使用页面编号为每个页面发出请求!

标签: javascript python web-scraping visual-studio-code beautifulsoup


【解决方案1】:

请求是通过POST 请求发出的,您可以查看我的previous-answer 以了解如何获取实际的API

html.parserlxml 也不属于您的问题。

我之所以使用lxml,是因为根据documentation,它比html.parser更快

import requests
from bs4 import BeautifulSoup
from pprint import pp


def main(url):
    with requests.Session() as req:
        for page in range(1, 44):
            print("[*] - Extracting Page# {}".format(page))
            data = {
                "table_name": "glasses",
                "family": "",
                "page": "{}".format(page),
                "sort": "",
                "display": "list",
            }
            r = req.post(url, data=data)
            soup = BeautifulSoup(r.text, 'lxml')
            pp([x.text for x in soup.select(
                '.text-clip') if x.get_text(strip=True)])


if __name__ == "__main__":
    main('http://www.o-review.com/ajax/database_filter_model.php')

【讨论】:

  • @The_Bandit 请edit您的帖子并突出显示您要提取的数据。
  • 我已经用我想要添加的内容编辑了我的代码。谢谢!
  • 我对为什么我的代码错误感到困惑......另外,我注意到你在使用 html.parser 时使用了 lxml。希望你能澄清!感谢您的信息!
  • @SIM 好吧,关于格式字符串,是的,我在进行多次编辑时打错了。关于from pprint import pp 1,最后一页是43
  • 我收到了ImportError: cannot import name 'pp' from 'pprint',所以我想通知你。无论如何,谢谢。
【解决方案2】:

我看到了这个问题的答案和您的评论。 αԋɱҽԃ αмєяιcαη 的代码起作用的原因是因为它将请求发送到坐席从中获取数据的实际 ajax api。您可以轻松地使用浏览器的开发者工具来追踪它。这不是因为 lxml 或其他原因,您只需要找到正确的来源;)

当然,αԋɱҽԃ αмєяιcαη 应该在他的回答中解释一些部分,以便为您澄清一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-03
    • 2022-01-20
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2023-03-23
    • 1970-01-01
    相关资源
    最近更新 更多