如何使用Python构建网络爬虫

您是否想学习如何从头开始构建网络爬虫?加入我的行列,向我展示如何使用Python作为本教程的选择语言来构建Web搜寻器。

您是否曾经想过如果没有搜索引擎,互联网将如何发展?好吧,如果我告诉您网络爬虫是使搜索引擎成为如今的今天的秘密。

事实证明,它们不仅在一般的Web搜索领域中而且在学术研究,潜在客户产生甚至搜索引擎优化(SEO)的其他方面都具有极其重要的意义。

任何打算从网站或整个Internet的许多页面上提取数据而没有事先要从中提取数据的链接列表的项目,很可能会利用网络爬虫来实现。

如果您有兴趣为项目开发Web爬网程序,那么您需要知道Web爬网程序的基础很简单,每个人都可以设计和开发一个。但是,取决于项目的复杂性和规模,合适的搜寻器可能难以构建和维护。在本文中,您将学习如何自己构建Web搜寻器。在正确学习本教程之前,让我们看一下Web爬网程序的实际含义。


什么是网络爬虫?

网页爬虫和网页抓取工具这两个术语可以互换使用,许多人认为它们的含义相同。尽管它们大致上是相同的意思,但是如果您深入研究,您会发现Web抓取和Web抓取并不相同–甚至可以从Web爬虫和Web抓取器的设计方式中看到这一点。

网络爬虫,也称为网络蜘蛛,蜘蛛机器人或简称为爬虫,是为了在网站索引和从访问的页面中收集其他数据而开发的系统地访问Web网页的Web机器人。

他们与Web抓取工具有何不同?

从上面可以看出,它们与Web刮板不同。它们都是网络数据提取的机器人。但是,您可以将Web scraper视为更加精简和专业的工作人员,这些工作人员旨在从特定的已定义网页列表中提取特定数据,例如Yelp评论,Instagram帖子,Amazon价格数据,Shopify产品数据等等。会收到网址列表,它会访问这些网址并抓取所需的数据。

对于Web爬网程序而言,情况并非如此,因为它们被提供了一个URL列表,并且从该列表中,Web爬网程序旨在遵循一些规则来查找要自己进行爬网的其他URL。营销人员可以互换使用这些术语的原因是,在Web爬网过程中涉及到Web爬网-某些Web爬网程序包含了Web爬网的各个方面。


Web爬网程序如何工作?

根据网络爬虫的复杂性和用例,它可以以网络爬虫的基本工作方式运行,也可以对其工作机制进行一些修改。在最基本的层次上,您可以将Web爬网程序看作是浏览器,用于浏览Internet上收集信息的网页。

Web爬网程序的工作机制很简单。为了使Web搜寻器正常工作,您必须向其提供URL列表-这些URL被称为种子URL。这些种子URL被添加到要访问的URL列表中。然后,搜寻器将浏览要访问的URL列表,并一个接一个地访问它们。

对于搜寻器所访问的每个URL,它都会提取页面上的所有超链接,并将它们添加到要访问的URL列表中。除了以其他方式收集超链接以覆盖站点或网站的宽度和宽度外,例如对于并非专门为特定网站设计的Web爬网程序,Web爬网程序还会收集其他信息。

例如,除链接数据外,Google bots是Internet上最流行的Web爬网程序,它也对页面内容进行索引以使其更易于搜索。另一方面,Web存档会对访问的页面进行快照-其他爬网程序会提取他们感兴趣的数据。除了要访问的URL列表之外,爬网程序还会保留已访问的URL列表。避免将爬网的URL添加到要爬网的站点列表中。

您必须考虑很多注意事项,包括为访问URL设置规则的爬网策略,规定何时需要在网页上进行更改的重新访问策略,礼貌策略。决定您是否应遵守robots.txt规则,最后是用于协调分布式Web爬网练习的并行化策略等。


使用Python开发网络爬虫

综上所述,我们希望您对什么是Web搜寻器有所了解。现在该开始学习如何发展自己。Web爬网程序是使用那里的任何通用编程语言编写的计算机程序。

您可以使用Java,C#,PHP,Python甚至JavaScript编写Web爬虫代码。这意味着开发Web搜寻器的首要前提是能够使用任何通用编程语言进行编码。

相关:如何使用Javascript从网站抓取HTML?

在本文中,由于Python的简单性,易用性,初学者友好性以及广泛的库支持,我们将使用Python。即使您不是Python程序员,也可以通过其他速成班fin python编程来理解将要讨论的内容,因为所有代码都将用Python编写。


项目构想:页面标题提取器

我们将要建设的项目将是一个非常简单的项目,可以称为概念证明。我们将开发的搜寻器将接受种子URL,并访问网站上的所有页面,并显示屏幕上的链接和标题。

我们将不尊重robots.txt文件,不使用代理,不使用多线程以及任何其他复杂性-我们将使您易于理解和理解。


项目要求

之前,我曾说过Python具有用于网络爬网的广泛工具库。对于Web爬网而言,最重要的都是Scrapy,它是一个Web爬网框架,可以轻松地用较少的代码行来开发Web爬网程序。但是,我们不会使用Scrapy,因为它隐藏了一些细节。让我们利用Requests和BeautifulSoup组合进行开发。

  • Python:虽然许多操作系统都预装了Python,但是安装的版本通常较旧,因此,您将需要安装Python的最新版本。您可以访问官方下载页面以下载Python编程语言的更新版本。
  • 请求:请求是人类的HTTP,它是将HTTP请求发送到Web服务器的最佳第三方库。它非常简单易用。在后台,该库使用了urllib包,但对其进行了抽象,并为您提供了更好的API,用于处理HTTP请求和响应。这是一个第三方库,因此,您需要下载它。您可以使用下载。
pip install Requests

 

  • BeautifulSoup:请求库用于发送HTTP请求,而BeautifulSoup则用于解析HTML和XML文档。使用BeautifulSoup,您不必处理使用不容易使用的正则表达式和标准HTM解析器,如果您不熟练使用它们,则容易出错。BeautifulSoup使您轻松浏览HTML文档并解析出所需的数据。该工具还是第三方库,未包含在标准python发行版中。您可以使用pip命令下载它:
pip install beautifulsoup4

编码页面标题提取器项目的步骤

如前所述,开发Web搜寻器的过程可能很复杂,但是我们在本教程中开发的搜寻器非常简单。实际上,如果您已经知道如何从网页中抓取数据,则很有可能已经知道如何开发简单的Web搜寻器。页面标题提取器项目将仅包含在一个模块中。您可以创建一个新的Python文件并将其命名

title_extractor.py

该模块将有一个名为TitleExtractor的类,具有2个方法。这两个类是

crawl

用于定义主要爬网逻辑,以及

start

用于在要抓取的URL上提供抓取方法指令。

  • 导入必要的库

首先,导入项目所需的库。我们需要请求,beautifulsoup和urlparse。请求用于发送Web请求,Beautifulsoup用于解析标题以及请求下载的网页中的URL。urlparse库捆绑在标准Python库中,用于解析URL。

from urllib.parseimport urlparse
import requests
from bs4 import BeautifulSoup
  • 网络爬虫类定义

导入所需的库后,让我们创建一个新的类名称TitleExtractor。这将是爬虫类。

class TitleCrawler:
"""
Crawler class accepts a URL as argument.
This seed url will be the url from which other urls will be discovered
"""
def __init__(self, start_url):
self.urls_to_be_visited = []
self.urls_to_be_visited.append(start_url)
self.visited = []
self.domain = "https://" + urlparse(start_url).netloc

从上面可以看到初始化函数 它接受URL作为参数。有3个变量用于保存要访问的URL列表,用于保存要访问的URL列表,变量用于保留访问的URL列表,以避免对URL进行多次爬网,而domain变量用于

urls_to_be_visited
visited
domain

您要从其抓取的网站。您将需要它,以便仅对来自域的链接进行爬网。

  • 启动方法编码
def start(self):
for urlin self.urls_to_be_visited:
self.crawl(url)

x = TitleCrawler("https://cop.guru/")
x.start()’

上面的start方法属于TitleExtractor类。您会看到一个for循环,该循环遍历urls_to_be_visited并将URL传递给爬网方法。爬网方法也是TitleExtractor类的方法。x变量用于创建TitleExtractor类的实例,然后调用start方法来使搜寻器开始爬网。根据以上代码片段,实际上什么也没做。主要工作是通过爬网方法完成的。下面是爬网方法的代码。

  • 检索方法编码
def crawl(self, link):
page_content = requests.get(link).text
soup = BeautifulSoup(page_content, "html.parser")
title = soup.find("title")
print("PAGE BEING CRAWLED: " + title.text + "|" + link )
self.visited.append(link)
urls = soup.find_all("a")
for urlin urls:
url = url.get("href")
if urlis not None:
if url.startswith(self.domain):
if urlnot in self.visited:
self.urls_to_be_visited.append(url)
print("Number of Crawled pages:" + str(len(self.visited)))
print("Number of Links to be crawled:" + str(len(self.urls_to_be_visited)))
print("::::::::::::::::::::::::::::::::::::::")

要被抓取的URL由start函数传递到抓取方法中,并且通过遍历urls_to_be_visited列表变量来实现。上面代码中的第一行将请求发送到URL,并返回页面的内容。

使用Beautifulsoup,页面的标题和页面上存在的URL被抓取。Web搜寻器仅用于搜寻目标网站的URL,因此,不考虑外部来源的URL 您可以从第二个if语句中看到。要将URL添加到要访问的URL列表中,它必须是有效URL,并且以前没有访问过。

  • 完整代码
from urllib.parseimport urlparse
import requests
from bs4 import BeautifulSoup

class TitleCrawler:
"""
Crawler class accepts a URL as argument.
This seed url will be the url from which other urls will be discovered
"""
def __init__(self, start_url):
self.urls_to_be_visited = []
self.urls_to_be_visited.append(start_url)
self.visited = []
self.domain = "https://" + urlparse(start_url).netloc

def crawl(self, link):
page_content = requests.get(link).text
soup = BeautifulSoup(page_content, "html.parser")
title = soup.find("title")
print("PAGE BEING CRAWLED: " + title.text + "|" + link )
self.visited.append(link)
urls = soup.find_all("a")
for urlin urls:
url = url.get("href")
if urlis not None:
if url.startswith(self.domain):
if urlnot in self.visited:
self.urls_to_be_visited.append(url)
print("Number of Crawled pages:" + str(len(self.visited)))
print("Number of Links to be crawled:" + str(len(self.urls_to_be_visited)))
print("::::::::::::::::::::::::::::::::::::::")

def start(self):
for urlin self.urls_to_be_visited:
self.crawl(url)

x = TitleCrawler("https://cop.guru/")
x.start()

您可以将种子URL更改为任何其他URL。在上面的代码中,我们使用https://cop.guru/。如果运行上面的代码,您将得到类似下面的结果。

PAGE BEING CRAWLED: Sneaker Bots • Cop Guru|https://cop.guru/sneaker-bots/

Number of Crawled pages:4

Number of Links to be crawled:1535

::::::::::::::::::::::::::::::::::::::

PAGE BEING CRAWLED: All in One Bots • Cop Guru|https://cop.guru/aio-bots/

Number of Crawled pages:5

Number of Links to be crawled:1666

::::::::::::::::::::::::::::::::::::::

PAGE BEING CRAWLED: Adidas Bots • Cop Guru|https://cop.guru/adidas-bots/

Number of Crawled pages:6

Number of Links to be crawled:1763

一个陷阱:该项目有很多改进

查看上面的代码,您很可能会毫无问题地运行它,但是当遇到异常时,该代码将停止运行。为了简单起见,在代码中未考虑任何异常处理。

除了异常处理之外,您还会发现没有加入反机器人系统规避技术,而实际上,许多流行的网站都采用了这种技术来阻止机器人访问。还有速度问题,您可以通过使bot多线程并提高代码效率来解决。除了这些,还有其他需要改进的地方。

结论

查看我们开发的Web爬网程序的代码,您将同意我的观点,即Web爬网程序类似于Web爬网程序,但范围更广。您需要知道的另一件事是,根据发现的URL数量,搜寻器的运行时间可能会很长,但是使用多线程,则可以缩短这一时间。另外,您还需要牢记,用于实际项目的复杂Web爬网程序将需要一种更有计划的方法。