【问题标题】:How can I parse long web pages with beautiful soup?如何用漂亮的汤解析长网页?
【发布时间】:2016-07-21 10:57:00
【问题描述】:

我一直在使用以下代码来解析链接https://www.blogforacure.com/members.php 中的网页。该代码应返回给定页面的所有成员的链接。

    from bs4 import BeautifulSoup
    import urllib
    r = urllib.urlopen('https://www.blogforacure.com/members.php').read()
    soup = BeautifulSoup(r,'lxml')
    headers = soup.find_all('h3')
    print(len(headers))
    for header in headers:
       a = header.find('a')
       print(a.attrs['href'])

但我只从上面的页面获得前 10 个链接。即使在打印美化选项时,我也只能看到前 10 个链接。

【问题讨论】:

  • 结果是通过 ajax 调用加载的。当您到达页面末尾时,将从服务器获取新结果。
  • 我该如何处理?
  • 我的方法是使用 Selenium 与页面交互并滚动到底部,如下所述:stackoverflow.com/questions/25870906/…

标签: python html web-scraping beautifulsoup


【解决方案1】:

通过向https://www.blogforacure.com/site/ajax/scrollergetentries.php 端点发出 AJAX 请求来动态加载结果。

使用requests 维护网络抓取会话在您的代码中模拟它们:

from bs4 import BeautifulSoup
import requests

url = "https://www.blogforacure.com/site/ajax/scrollergetentries.php"
with requests.Session() as session:
    session.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'}
    session.get("https://www.blogforacure.com/members.php")

    page = 0
    members = []
    while True:
        # get page
        response = session.post(url, data={
            "p": str(page),
            "id": "#scrollbox1"
        })
        html = response.json()['html']

        # parse html
        soup = BeautifulSoup(html, "html.parser")
        page_members = [member.get_text() for member in soup.select(".memberentry h3 a")]
        print(page, page_members)
        members.extend(page_members)

        page += 1

它将当前页码和每页累积成员名称的成员列表打印到members 列表中。没有发布它打印的内容,因为它包含名称。

请注意,我故意让循环无限循环,请弄清楚退出条件。可能是response.json() 抛出错误的时候。

【讨论】:

  • 我是新手,我有一个非常基础的问题,您是如何了解 site/ajax/scrollergetentries.php 的?如何获得另一个页面。你能给我解释一下 session.post()
  • @athira 我使用了浏览器开发工具,在页面加载时使用了网络选项卡,然后滚动并看到对scrollergetentries.php 端点的多个请求。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 2019-11-10
  • 2013-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2021-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多