您是否曾经发现自己处于这样一种情况:第二天要参加考试,或者可能要进行演示,并且您正在谷歌搜索页面上一页又一页地翻阅,试图寻找可以帮助您的文章?
在本文中,我们将研究如何自动化这个单调的过程,以便您可以将精力集中到更好的任务上。
对于本练习,我们将使用 Google 协作平台并在其中使用 Scrapy。当然,你也可以直接将Scrapy安装到本地环境中,步骤是一样的。
正在寻找批量搜索或 API?
下面的程序是实验性的,向您展示了如何在 Python 中抓取搜索结果。但是,如果你批量运行它,谷歌防火墙很可能会阻止你。如果您正在寻找批量搜索或围绕它构建一些服务,您可以查看Zenserp。
Zenserp 是一个谷歌搜索 API,它解决了抓取搜索引擎结果页面所涉及的问题。当抓取搜索引擎结果页面时,您很快就会遇到代理管理问题。Zenserp 自动轮换代理并确保您只收到有效的响应。
它还支持图像搜索、购物搜索、图像反向搜索、趋势等,使您的工作变得更轻松。您可以在这里尝试一下,只需触发任何搜索结果并查看 JSON 响应。
初始化 Google 协作实验室
转至https://colab.research.google.com/并使用您的 Google 帐户登录。转到文件> 创建新笔记本。然后转到该图标并单击。点击确认按钮:
现在这将需要几秒钟。然后在代码区域中输入:
!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 行,因为我们不需要它。更改名称。
文件系统如下所示(仅供参考):
这是我们的蜘蛛的名称,您可以使用各种参数存储任意数量的蜘蛛。在 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" ) |
瞧!在这里,我们再次运行蜘蛛,我们只获得与我们网站相关的链接以及文本描述。
我们到这里就完成了。
将其放入 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 ”的输出文件:
提取元描述
我们可以更进一步,还可以访问文本下方的描述:
所以我们将修改解析函数。我们使用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' ) |
所以现在如果我们运行我们的代码,我们会得到第四列:
就是这样!
如果您错过了其中任何一个,您可以在此处查看所有代码: https: //github.com/arkaprabha-majumdar/google-crawler
感谢您的阅读。查看其他文章并继续编程。干杯。