如何使用 Python Scrapy 抓取 Google 搜索结果

您是否曾经发现自己处于这样一种情况:第二天要参加考试,或者可能要进行演示,并且您正在谷歌搜索页面上一页又一页地翻阅,试图寻找可以帮助您的文章?

在本文中,我们将研究如何自动化这个单调的过程,以便您可以将精力集中到更好的任务上。

对于本练习,我们将使用 Google 协作平台并在其中使用 Scrapy。当然,你也可以直接将Scrapy安装到本地环境中,步骤是一样的。

正在寻找批量搜索或 API?

下面的程序是实验性的,向您展示了如何在 Python 中抓取搜索结果。但是,如果你批量运行它,谷歌防火墙很可能会阻止你。如果您正在寻找批量搜索或围绕它构建一些服务,您可以查看Zenserp

Zenserp 是一个谷歌搜索 API,它解决了抓取搜索引擎结果页面所涉及的问题。当抓取搜索引擎结果页面时,您很快就会遇到代理管理问题。Zenserp 自动轮换代理并确保您只收到有效的响应。

它还支持图像搜索、购物搜索、图像反向搜索、趋势等,使您的工作变得更轻松。您可以在这里尝试一下,只需触发任何搜索结果并查看 JSON 响应。

初始化 Google 协作实验室

转至https://colab.research.google.com/并使用您的 Google 帐户登录。转到文件> 创建新笔记本。然后转到该图标并单击。点击确认按钮:

在 Colab 中安装驱动器

现在这将需要几秒钟。然后在代码区域中输入:

!pip install scrapy

这将在 Google colab 中安装 Scrapy,因为它不是内置的。接下来,我们导入我们的包:

import scrapy
import pandas

还记得如何安装驱动器吗?是的,现在进入标题为“drive”的文件夹,然后导航到您的 Colab Notebooks。右键单击它,然后选择复制路径

现在在代码编辑器中输入:

%cd "/content/drive/My Drive/Colab Notebooks/"

现在我们准备初始化我们的 scrapy 项目,它将保存在我们的 Google Drive 中以供将来参考。

进入代码编辑器:

!scrapy startproject google_crawler

这将在您的 Colab 笔记本中创建一个 scrapy 项目存储库。如果您无法跟上,或者某个地方出现了失误并且该项目存储在其他地方,不用担心。我们可以简单地移动它:

!mv google_crawler "/content/drive/My Drive/Colab Notebooks/"

完成后,我们将开始构建蜘蛛。

构建 Python Scrapy Spider

打开 google_crawler 存储库。你会在里面找到一个“ spiders”文件夹。这是我们放置新蜘蛛代码的地方。

因此,通过单击文件夹在此处创建一个新文件,并为其命名。我们从包导入开始:

import scrapy
from scrapy.linkextractors import LinkExtractor
import pandas as pd

您暂时不需要更改类名。让我们稍微整理一下。

删除 allowed_domains 行,因为我们不需要它。更改名称。

文件系统如下所示(仅供参考):

Scrapy 的文件系统

这是我们的蜘蛛的名称,您可以使用各种参数存储任意数量的蜘蛛。在 start_urls 列表中,我们可以添加我们的 google 搜索:

class firstSpider(scrapy.Spider):
  name = "basic"
  start_urls = [
    "https://www.google.com/search?q=journal+dev"
   ]

现在,让我们创建解析函数,并使用链接提取器来获取链接:

def parse(self, response):
    xlink = LinkExtractor()
    for link in xlink.extract_links(response):
      print(link)

在代码编辑器中,使用以下命令运行它:

!scrapy crawl basic

我们看到这里的链接不止几个,而且很多都是Google.com搜索的,所以我们可以用if条件过滤掉它们:

def parse(self, response):
    xlink = LinkExtractor()
    for link in xlink.extract_links(response):
      if len(str(link))>200 or 'Journal' in link.text:
        print(len(str(link)),link.text,link,"\n")

瞧!在这里,我们再次运行蜘蛛,我们只获得与我们网站相关的链接以及文本描述。

Google 搜索结果已成功抓取

我们到这里就完成了。

将其放入 DataFrame 中

然而,终端输出大多是无用的。如果您想用它做更多的事情(例如爬行列表中的每个网站,或将它们提供给某人),那么您需要将其输出到文件中。为此,我们将使用pandas

def parse(self, response):
    df = pd.DataFrame()
    xlink = LinkExtractor()
    link_list=[]
    link_text=[]
    for link in xlink.extract_links(response):
      if len(str(link))>200 or 'Journal' in link.text:
        print(len(str(link)),link.text,link,"\n")
        link_list.append(link)
        link_text.append(link.text)
    df['links']=link_list
    df['link_text']=link_text
    df.to_csv('output.csv')

现在,如果我们运行它,我们会得到一个名为“ output.csv ”的输出文件:

Google 期刊开发搜索的蜘蛛输出

提取元描述

我们可以更进一步,还可以访问文本下方的描述:

描述如下搜索链接

所以我们将修改解析函数。我们使用response.xpath(//div/text())来获取div标签中存在的所有文本然后通过简单的观察,我在终端中打印了每个文本的长度,发现100以上的最有可能是描述。由于它们的获取顺序与链接相同,因此我们将它们排列起来没有问题:

def parse(self, response):
  df = pd.DataFrame()
  xlink = LinkExtractor()
  link_list=[]
  link_text=[]
  divs = response.xpath('//div')
  text_list=[]
  for span in divs.xpath('text()'):
    if len(str(span.get()))>100:
      text_list.append(span.get())
  for link in xlink.extract_links(response):
    if len(str(link))>200 or 'Journal'in link.text:
      #print(len(str(link)),link.text,link,"\n")'''
      link_list.append(link)
      link_text.append(link.text)
  for i in range(len(link_text)-len(text_list)):
    text_list.append(" ")
  df['links']=link_list
  df['link_text']=link_text
  df['text_meta'] = text_list
  df.to_csv('output.csv')

所以现在如果我们运行我们的代码,我们会得到第四列:

描述提取 – 来自 CSS 的元数据 Div/Span

就是这样!

如果您错过了其中任何一个,您可以在此处查看所有代码: https: //github.com/arkaprabha-majumdar/google-crawler

感谢您的阅读。查看其他文章并继续编程。干杯。