首页 > 解决方案 > Python 漂亮的网页抓取模拟点击抓取所有页面

问题描述

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

检查器中的 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)

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

标签: javascriptpythonweb-scrapingvisual-studio-codebeautifulsoup

解决方案


该请求是通过POST请求提出的,您可以在其中查看我以前的答案,以了解如何获得实际的API

html.parserlxml不是您问题的一部分。

我之所以使用lxml它是因为它比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')

推荐阅读