【问题标题】:Selenium & Beautiful Soup scraping is returning an unexpected resultSelenium 和 Beautifulsoup 抓取返回了意想不到的结果
【发布时间】:2020-08-15 09:31:35
【问题描述】:

USPTO 网站提供每周更新的公共数据。每次他们发布新数据时,他们都会以上周的“增量数据”形式发布。我正在尝试使用 python 下载这些数据,所以我不必每周手动进行。

发生了一些奇怪的事情:

首先,browser.page_source 包含 html(但不是正确的 - 我检查过)。但是当我将该 html(作为字符串)传递给 BeatifulSoup 时,soup.current_data 是空的。

其次,返回的 html 不是完整的 html,并且根本不包含 delta 或该部分,即使它位于浏览器中的站点 html 中:

关于如何下载该文件的任何想法?我最终需要调用deltaJsonDownload() js 函数。

要重现的代码:

from bs4 import BeautifulSoup
from selenium import webdriver


url = 'https://ped.uspto.gov/peds/'
browser = webdriver.PhantomJS(executable_path='/usr/bin/phantomjs')
browser.get(url)
html = browser.page_source
soup = BeautifulSoup(browser.page_source)
assert('delta' in browser.page_source)

【问题讨论】:

    标签: python selenium web-scraping beautifulsoup


    【解决方案1】:

    当您分析网站网络调用时,它会发出 ajax 请求以获取所有链接以供下载数据。

    import requests
    
    res = requests.get("https://ped.uspto.gov/api/")
    
    data = res.json()
    
    print(data)
    

    输出:

    {'message': None,
     'helpText': '{}',
     'xmlDownloadMetadata': [{'lastUpdated': 'Sat 15 Aug 2020 01:30:57-0400',
       'sizeInBytes': 10429068701,
       'fileName': 'pairbulk-delta-20200815-xml',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 10:20:10-0400',
       'sizeInBytes': 100685778,
       'fileName': '1900-1919-pairbulk-full-20200809-xml',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 10:20:14-0400',
       'sizeInBytes': 13877,
       'fileName': '1920-1939-pairbulk-full-20200809-xml',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 10:20:15-0400',
       'sizeInBytes': 93016,
       'fileName': '1940-1959-pairbulk-full-20200809-xml',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 10:20:15-0400',
       'sizeInBytes': 82353484,
       'fileName': '1960-1979-pairbulk-full-20200809-xml',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 10:20:16-0400',
       'sizeInBytes': 5019098918,
       'fileName': '1980-1999-pairbulk-full-20200809-xml',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 10:20:46-0400',
       'sizeInBytes': 33231977060,
       'fileName': '2000-2019-pairbulk-full-20200809-xml',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 10:23:23-0400',
       'sizeInBytes': 24313575,
       'fileName': '2020-2020-pairbulk-full-20200809-xml',
       'updatedFile': False}],
     'jsonDownloadMetadata': [{'lastUpdated': 'Sat 15 Aug 2020 03:08:00-0400',
       'sizeInBytes': 5957650088,
       'fileName': 'pairbulk-delta-20200815-json',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 15:18:23-0400',
       'sizeInBytes': 66467976,
       'fileName': '1900-1919-pairbulk-full-20200809-json',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 15:18:25-0400',
       'sizeInBytes': 10100,
       'fileName': '1920-1939-pairbulk-full-20200809-json',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 15:18:27-0400',
       'sizeInBytes': 69891,
       'fileName': '1940-1959-pairbulk-full-20200809-json',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 15:18:29-0400',
       'sizeInBytes': 54076774,
       'fileName': '1960-1979-pairbulk-full-20200809-json',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 15:18:31-0400',
       'sizeInBytes': 3009216952,
       'fileName': '1980-1999-pairbulk-full-20200809-json',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 15:18:46-0400',
       'sizeInBytes': 18853619536,
       'fileName': '2000-2019-pairbulk-full-20200809-json',
       'updatedFile': False},
      {'lastUpdated': 'Sun 09 Aug 2020 15:20:30-0400',
       'sizeInBytes': 17518389,
       'fileName': '2020-2020-pairbulk-full-20200809-json',
       'updatedFile': False}],
     'links': [{'rel': 'swagger-api-docs', 'href': '/api-docs'}]}
    

    解析 json 并使用这些链接,您可以轻松下载您要查找的文件。但我会说这些文件是相当大的文件,最好在请求中使用流式下载。

    您要查找的链接是data["jsonDownloadMetadata"]中的第一个元素

    为了得到可下载的链接,解析json

    data = res.json()
    
    for links in data["jsonDownloadMetadata"]:
        print(f"https://ped.uspto.gov/api/full-download?fileName={links['fileName']}")
    

    输出:

    https://ped.uspto.gov/api/full-download?fileName=pairbulk-delta-20200815-json
    https://ped.uspto.gov/api/full-download?fileName=1900-1919-pairbulk-full-20200809-json
    https://ped.uspto.gov/api/full-download?fileName=1920-1939-pairbulk-full-20200809-json
    https://ped.uspto.gov/api/full-download?fileName=1940-1959-pairbulk-full-20200809-json
    https://ped.uspto.gov/api/full-download?fileName=1960-1979-pairbulk-full-20200809-json
    https://ped.uspto.gov/api/full-download?fileName=1980-1999-pairbulk-full-20200809-json
    https://ped.uspto.gov/api/full-download?fileName=2000-2019-pairbulk-full-20200809-json
    https://ped.uspto.gov/api/full-download?fileName=2020-2020-pairbulk-full-20200809-json
    

    【讨论】:

    • 嘿,非常感谢 - 这绝对是比我采取的更好的方向。我如何从这些文件名中获取实际的下载链接?另外,我研究了流式下载,这正是我将尝试做的。
    • 太棒了!只是想知道.. 你怎么知道端点是如何被调用的以及去哪里?
    • 网站加载时在 chrome 开发者工具中打开网络标签
    猜你喜欢
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-15
    • 2017-01-05
    • 2021-10-14
    相关资源
    最近更新 更多