是否可以为 PDF 文件抓取 Google?

Is it possible to scrape Google for PDF files?

是否可以抓取 PDF 文件 Google?例如,在给定术语的一定数量的搜索结果中下载所有“.pdf”文件。 Webscraping 对我来说很新,尽管我一直在使用 beautifulsoup4 如果可能的话。

提前致谢。

这是我会做的。

  1. Google 允许您通过添加 filetype:[your file type extension (pdf)].

  2. 按文件类型搜索
  3. 您可以使用直接 URL 并更改查询来绕过 Google 搜索页面:https://www.google.com/search?q=these+are+keywords+filetype%3Apdf

  4. 您可以使用BeautifulSoup找到每个搜索结果()的URL。最重要的部分是每个搜索结果都有一个 class “g”,因此您可以从每个具有 class.[=17= 的元素中获取 URL ]

  5. 从那里,您可以使用 BeautifulSoup 找到 PDF 的直接 URL。 URL 的标签类型为“a”,格式为 hrefRelevant question's answer

我不是专家,但也许这足以让您上路。其他人可能会提出更好的方法。

确保您使用的是 user-agent,因为最终 Google 可能会阻止请求,您将收到一个完全不同的 HTML。 Check out what is your user-agent.

通过 user-agent:

headers = {
    'User-agent':
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}

requests.get(URL, headers=headers)

首先遍历所有有机结果:

for index, result in enumerate(soup.select('.tF2Cxc')):
  # code

# enumerate() was used to provide index values after each iteration 
# that will be handy at the saving stage to use them via f-string e.g: file_0,1,2,3..

通过 if 语句检查 PDF 是否存在:

if result.select_one('.ZGwO7'):
  pdf_file = result.select_one('.yuRUbf a')['href']
  # other code
else: pass

要在本地保存 .pdf 个文件,您可以使用 urllib.request.urlretrieve:

urllib.request.urlretrieve(pdf_file, "YOUR_FOLODER(s)/YOUR_PDF_FILE_NAME.pdf")
# if saving in the same folder, remove "YOUR_FOLDER" part

代码和example in the online IDE:

from bs4 import BeautifulSoup
import requests, lxml, urllib.request

headers = {
    'User-agent':
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}

params = {
  "q": "best lasagna recipe:pdf"
}

def get_pdfs():
    html = requests.get('https://www.google.com/search', headers=headers, params=params)
    soup = BeautifulSoup(html.text, 'lxml')

    for index, result in enumerate(soup.select('.tF2Cxc')):

      # check if PDF is present via according CSS class
      if result.select_one('.ZGwO7'):
        pdf_file = result.select_one('.yuRUbf a')['href']
        
        opener=urllib.request.build_opener()
        opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582')]
        urllib.request.install_opener(opener)

        # save PDF
        urllib.request.urlretrieve(pdf_file, f"bs4_pdfs/pdf_file_{index}.pdf")

        print(f'Saving PDF №{index}..')
      else: pass

-------
'''
Saving PDF №0..
Saving PDF №1..
Saving PDF №2..
...

8 pdf's saved to the desired folder
'''

或者,您可以使用 SerpApi 中的 Google Organic Results API 来实现此目的。这是付费 API 和免费计划。

你的情况的不同之处在于你不需要弄清楚如何提取某些部分或元素,因为它已经为最终用户完成了。

要集成的代码:

from serpapi import GoogleSearch
import os, urllib.request

def get_pdfs():
    params = {
      "api_key": os.getenv("API_KEY"),
      "engine": "google",
      "q": "best lasagna recipe:pdf",
      "hl": "en"
    }

    search = GoogleSearch(params)
    results = search.get_dict()

    for index, result in enumerate(results['organic_results']):
      if '.pdf' in result['link']:
        pdf_file = result['link']

        opener=urllib.request.build_opener()
        opener.addheaders=[('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582')]
        urllib.request.install_opener(opener)

        # save PDF
        urllib.request.urlretrieve(pdf_file, f"serpapi_pdfs/pdf_file_{index}.pdf")

        print(f'Saving PDF №{index}..')
      else: pass

get_pdfs()

-------
'''
Saving PDF №0..
Saving PDF №1..
Saving PDF №2..
...

8 pdf's saved to the desired folder
'''

此外,您可以使用 camelot 库从 .pdf 个文件中获取数据。

Disclaimer, I work for SerpApi.