Acquire

返回博客

分步教程:使用 Python 制作网页抓取工具

Gabija Fatenaite

2022-06-23

网络抓取入门并不复杂。Python 抓取网页数据并不难,它是上手最为简单的方法,因为它是以对象为中心的语言。Python 的类和对象可以说是最易于使用的语言了。而且,它还有许多库,这就使得我们用 Python 来构建网页抓取工具非常简单。

在本教程中,我们将介绍如何用 Python 制作一款简单的应用程序。这款工具需要从网页源获取文本数据,将它存储在文件中,并根据设定的参数将输出结果进行排序。如需了解使用 Python 进行网页抓取的复杂功能,请阅读至文章结尾部分,我们会提出实施建议。按照这份 Python 网络爬虫制作分步教程的逐步进行操作,就能轻松掌握网页抓取方法。用 Python 网络爬虫抓取数据非常好用。

什么是网页抓取?

网页抓取是指自动收集公共数据的过程。网页抓取工具可以在几秒钟之内从目标网站自动提取海量公开可用数据。

这份 Python 抓取数据教程适用于所有操作系统。安装 Python 或开发环境的方法会稍有差异,其他步骤则基本一样。

制作网页抓取工具:Python 准备工作

在这份 Python 网页抓取分步教程中,全程使用 Python 3.4+ 版本。确切说,我们用的是 Python 3.8.3 版,一般来说,Python 3.4 以上版本都可以。

在 Windows 系统上安装 Python 时,请勾选 “PATH installation”(PATH 安装)。PATH 安装会将可执行文件添加到默认的 Windows 命令提示符可执行文件搜索中。因此 Windows 就能识别 “pip” 或 “python” 等命令,而无需为其指定可执行文件的目录(例如 C:/tools/python/.../python.exe)。如果已经安装 Python 但没有勾选 PATH 安装,重新运行安装程序并选择修改就可以了。在第二个屏幕中选择 “Add to environment variables”(添加到环境变量)。

简要介绍 Python 的库

Python 带有许多实用的库,因此用它来进行网页抓取十分简单

Python 的一大优点是它有许多可用于网页抓取的库。这些库还只是现有几千个 Python 项目中的一部分,仅在 PyPI 上,现有项目就已超过 30 万个。Python 爬虫需要哪些库?以下几种类型的 Python 网页抓取库可供您选择:

  • Requests

  • Beautiful Soup

  • lxml

  • Selenium

Requests 库

网页抓取时,首先要向网站服务器发送 HTTP 请求(例如 POST 或 GET), 然后从网站服务器返回的响应中会包含所需数据。但标准 Python HTTP 库有使用门槛,要真正达到高效抓取的程度,需要大量代码,这就进一步加大了难度。

与其他 HTTP 库有所不同的是,Requests 库 流程简单,需要的代码行数较少,使代码易于理解,也容易调试,却能保证相同有效性。使用 pip 命令就可以在终端内部安装库。

pip install requests

Requests 库提供了发送 HTTP GET 和 POST 请求的简便方法。比如,发送 HTTP Get 请求的函数可以轻松命名为 get():

import requests
response = requests.get("https://oxylabs.io/”)
print(response.text)

如需发布表格,通过 post() 方法即可轻松做到。这类数据可以作为字典发送,方法如下:

form_data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post("https://oxylabs.io/ ", data=form_data)
print(response.text)

通过 Requests 库还可以轻松使用需要身份验证的代理。

proxies={'http': 'http://user:password@proxy.oxylabs.io'}
response = requests.get('http://httpbin.org/ip', proxies=proxies)
print(response.text)

但这个库有个缺点,它不能解析提取的 HTML 数据,它无法将数据转换为用于分析的可读格式。而且,它也无法用于抓取单纯以 JavaScript 语言编写的网站。

Beautiful Soup

这种库配合解析器,可以从 HTML 提取数据,甚至能够将无效标记转换为解析树。但这个库只能用于解析,不能以 HTML 文档/文件的格式从网络服务器请求数据。正因为这个原因,它大多数时候都是搭配 Python Request 库一起使用。Beautiful Soup 可以帮助轻松进行查询并找到 HTML,但还是需要解析器。下方示例将演示 html.parser模块的用法,这个模块是 Python 标准库的重要组成部分。

第 1 部分:通过 Requests 获取 HTML

import requests
url='https://oxylabs.io/blog'
response = requests.get(url)

第 2 部分:查找要素

from bs4 import BeautifulSoup
soup = BeautifulSoup(response.text, 'html.parser')
print(soup.title)

这时会将标题要素打印如下:

<h1 class="blog-header">Oxylabs Blog</h1>

因 Beautiful Soup 的导航、搜索和修改解析树的方法都十分简单,即使是对初学者来说都算友好,通常可以为开发人员节省几个小时的开发时间。例如,要这个页面打印所有博文标题,可以使用 findAll() 方法。在这个页面上,所有的博文标题都含有 h2 元素,类属性都为 blog-card__content-title。这一信息可以用于 findAll 方法,用法如下:

blog_titles = soup.findAll('h2', attrs={"class":"blog-card__content-title"})
for title in blog_titles:
    print(title.text)
# Output:
# Prints all blog tiles on the page

BeautifulSoup 还可以轻松配合 CSS 选择器使用。如果开发人员懂 CSS 选择器,那就无需学习 find() 或 find_all() 方法。下方仍然是同一示例,但是使用了 CSS 选择器:

blog_titles = soup.select('h2.blog-card__content-title')
for title in blog_titles:
    print(title.text)

尽管 BeautifulSoup 库具有解析已损坏 HTML 的主要功能,除此以外它还有许多其他功能,比如能够检测页面编码。进一步提高从 HTML 文件中所提取数据的准确度。

而且,您可以轻松对它进行配置,只需几行代码,就可以提取所有自定公开可用数据,或者是识别特定数据类型。

lxml

Lxml 是一个快速强大又易于使用的解析库,可以处理 HTML 和 XML 文件。在从大型数据集提取数据时,lxml 非常友好。但与 Beautiful Soup 有所不同的是,这个库在处理设计不良的 HTML 数据时,解析能力大打折扣。

使用 pip 命令就可以在终端内部进行 lxml 安装。

pip install lxml

Lxml 库包含一个可与 HTML 配合使用的 html 模块。但 lxml 库首先需要 HTML 字符串。这个 HTML 字符串可以通过 Requests 库进行检索,我们在前文中已经提到过。只要 HTML 可用,就可以使用 fromstring 方法来构建树结构,具体情形如下:

# After response = requests.get() 
from lxml import html
tree = html.fromstring(response.text)

现在您可以通过 XPath 查询此树形对象。继续讨论上文讨论的示例,获取博文标题,那么 XPath 显示如下:

//h2[@class="blog-card__content-title"]/text()

现在可以将此 Xpath 传给 tree.xpath() 函数。这时会返回匹配这一 XPath 的所有元素。请留意 XPath 中的 text() 函数。这个函数会提取 h2 元素中的文本。

blog_titles = tree.xpath('//h2[@class="blog-card__content-title"]/text()')
for title in blog_titles:
    print(title)

Selenium

我们说过,有的网站是用 JavaScript 编写的,这种语言可以帮助开发人员动态填充字段和菜单。这种特点会给只能提取静态网页数据的 Python 库造成障碍。事实上,遇到 JavaScript 时,Requests 库就失灵了。这就是 Selenium 网页抓取技术大显身手的时候了。我们来看看 Python 爬虫 Selenium 库的用法。

这种 Python 网页库属于开源浏览器自动化工具(web driver),它可以帮助您将流程自动化,例如自动登录社交媒体平台。Selenium 多用于在网络应用程序上测试案例或脚本。它的优点是在网页抓取过程中,能够像浏览器一样,通过运行 JavaScript 来渲染网页,而标准网络爬虫却无法运行这种编程语言。但开发人员却非常喜欢使用 Selenium 库。

Selenium 库需要三个组件:

  • 网页浏览器 - 支持的浏览器包括 Chrome、Edge、Firefox 和 Safari

  • 浏览器驱动器 – 请查看此页面获取驱动器链接。

  • Selenium 安装包

可以通过终端安装 Selenium 安装包:

pip install selenium

安装后,便可以导入浏览器的对应类。接着,必须创建类的对象。注意,这需要提供可执行的驱动器路径。使用 Chrome 浏览器的示例情形如下:

from selenium.webdriver import Chrome
driver = Chrome(executable_path='/path/to/driver')

现在使用浏览器通过 get() 方法可以加载任何网页。

driver.get('https://oxylabs.io/blog')

用户可以通过 Selenium 使用 CSS 选择器和 XPath 提取元素。以下示例显示可以通过 CSS 选择器打印多有博文标题:

blog_titles = driver.get_elements_by_css_selector(' h2.blog-card__content-title')
for title in blog_tiles:
    print(title.text)
driver.quit() # closing the browser

一般而言,运行 JavaScript 后,Selenium 可以处理动态显示的任何内容,从而可以通过内建方法甚至 Beautiful Soup 解析网页内容。而且,它还可以模拟真人浏览行为。

在网页抓取中使用 Selenium 只有一个不利之处,那就是它会拖慢流程,因为 Selenium 必须先为每个网页执行 JavaScript 代码,然后才能进行解析。因此,Selenium 对于大型数据提取并非理想之选。如果您要提取的数据,在规模和速度上要求不高,那么 Selenium 仍不失为一个好的选择。

用于网页抓取的 Python 库比较图示

Requests 代理 Beautiful Soup 代理 lxml 代理 Selenium 代理
用途 简化发送 HTTP 请求的流程 解析 解析 简化发送 HTTP 请求的流程
易用程度
速度 非常快
学习难度 非常简单(适合初学者 非常简单(适合初学者 简单 简单
整理 非常好 非常好
是否支持 JavaScript 不支持 不支持 不支持 支持
CPU 和内存占用
支持网页抓取项目的规模 大小规模都支持 大小规模都支持 大小规模都支持 大小规模

在这份 Python 抓取数据教程中,我们将使用三个重要的库:BeautifulSoup 第 4 版、Pandas 和 Selenium。本指南后续步骤则假定已成功安装以上三个库。如果系统提示您 “NameError: name * is not defined”。那么可能其中有一个安装程序已失败。

网络驱动程序与浏览器

网页抓取工具都需要浏览器,因为它必须连接目标 URL。对于测试,我们强烈推荐(尤其是新手)使用普通浏览器(或者非无头浏览器)。了解编写的代码如何与应用程序进行交互,就可以进行简单的故障排除和调试,并且有助于更好地理解整个过程。

无头浏览器因为更加高效,可以等以后用于复杂任务。在这份教程中,我们使用 Chrome 网页浏览器,过程与使用 Firefox 大同小异。

首先,通过您的首选搜索引擎查找 “Chrome 的网络驱动程序”或者 “Firefox 的网络驱动程序”。记下您的浏览器当前版本。下载与您的浏览器版本相匹配的网络驱动程序。

根据适用情况选择相应的安装包,下载后并解压缩文件。将此驱动程序的可执行文件拷贝到任意一个便于访问的目录下。您的操作步骤是否正确,等会才会知道。

为 Python 网络爬虫妥善寻找编码环境

现在我们来完成进入网页抓取教程的编程环节前的最后一步:选择良好的编码环境。有许多方法可以做到这一点,可以是简单的文本编辑器,这样的话只要创建 *.py 文件并直接写下代码即可;也可以是功能齐全的 IDE,也就是集成开发环境。

如果您已经安装 Visual Studio Code,选择 IDE 则是最简单的。不然的话,我强烈推荐零起点人士使用 PyCharm,因为它对新手非常友好,界面简单直观。接下来的部分教程中,我们会使用 PyCharm。

在 PyCharm 中,右键单击项目区,然后“新建 > Python 文件”。给它取个名字!

导入并使用库

现在该启用所有已安装的程序了:

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver

PyCharm 可能将导入内容显示为灰色,它会自动标记未使用的库。不要接受系统删除未使用库的建议。

首先,我们必须定义浏览器。根据我们之前选择的网络驱动程序,我们输入:

driver = webdriver.Chrome(executable_path='c:\path\to\windows\webdriver\executable.exe')

或者

driver = webdriver.Firefox(executable_path='/nix/path/to/webdriver/executable')

选择 URL

Python 网页抓取需要查看网站源

在开始执行首次测试运行前,先选择 URL。在这份教程中,我们要创建一个基本应用程序,因此,我们建议选择一个简单的目标 URL:

  • 避免 JavaScript 元素中的隐藏数据。有时需要执行特定操作,才能显示所需数据。要抓取 JavaScript 元素的数据必须使用更加高级的 Python 及其逻辑。

  • 不要抓取图像。可以直接用 Selenium 下载图像。

  • 在进行抓取之前,确保您抓取的是公开可用数据,不会损害第三方权益。而且,请注意查看 robots.txt 文件获取指引。

选择自己想要访问的登录页面,然后将 URL 输入 driver.get(‘URL’) 参数中。Selenium 需要提供连接协议。因此,URL前面必须带有 “http://” 或 “https://”。

driver.get('https://your.url/here?yes=brilliant')

点击左下方的绿色箭头即可开始测试运行,您也可以右键点击编码环境,然后选择 “Run”。

点击红色指示处

如果系统提示错误信息,文件丢失,那么仔细查看驱动程序中 “webdriver.*” 的路径和网络驱动程序可执行文件的位置是否一致。如果系统提示版本不合,请重新下载正确的网络驱动程序可执行文件。

定义对象并建立列表

编程人员通过 Python 可以设计对象而无需指定具体类型。只要输入标题并指定一个值,即可创建对象。

# Object is “results”, brackets make the object an empty list.
# We will be storing our data here.
results = []

Python 中的列表有序可变,允许复制列表中的成员也可以使用其他集合,例如集合或者字典,但列表是最简单易用的。定义更多对象!

# Add the page source to the variable `content`.
content = driver.page_source
# Load the contents of the page, its source, into BeautifulSoup 
# class, which analyzes the HTML as a nested data structure and allows to select
# its elements by using various selectors.
soup = BeautifulSoup(content)

再继续之前,让我们看看目前为止代码的外观:

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')
driver.get('https://your.url/here?yes=brilliant')
results = []
content = driver.page_source
soup = BeautifulSoup(content)

重新运行程序。应该不会出现错误信息了。如果还有,前文已经给出了一些可能的故障排除方法。

使用 Python 网络爬虫提取数据

我们终于来到了有意思又有难度的部分,提取 HTML 文件中的数据。我们往往都是从网页的各种不同部分提取很小一部分,然后将它存储在列表中,我们应该逐个处理更小的部分,然后将它添加到列表:

# Loop over all elements returned by the `findAll` call. It has the filter `attrs` given
# to it in order to limit the data returned to those elements with a given class only.
for element in soup.findAll(attrs={'class': 'list-item'}):
    ...

“soup.findAll” 可以接受各种参数。鉴于本教程的用途,我们仅选择 “attrs”(属性)。通过它,我们可以设置一个条件 “if attribute is equal to X is true then…”(如果属性等于X为真,那么……),来缩小搜索范围。这样一来,我们可以轻松找到并使用类。

现在我们在真实的浏览器中输入 URL,然后继续。组合键 CTRL+U(Chrome)或者右键选择“查看网页源代码”打开网页源代码。找到嵌套数据的“最近”一个类。也可以按 F12 打开开发者工具,选择 “Element Picker”。例如,可能会嵌套为:

<h4 class="title">
    <a href="...">This is a Title</a>
</h4>

属性 “Class”(类)就是 “title”(标题)。如果选择简单的目标,大多数情况下,数据嵌套方式与以上示例类似。复杂目标可能需要更多工作,才能抓取到数据。我们回到编程,然后添加从源代码中找到的类。

# Change ‘list-item’ to ‘title’.
for element in soup.findAll(attrs={'class': 'title'}):
  ...

循环会遍历网页源代码 “title” 类的所有对象。我们处理每一个对象:

name = element.find('a')

然后看看循环如何遍历 HTML:

<h4 class="title">
    <a href="...">This is a Title</a>
</h4>

第一个语句(在循环本身内部)可以找到匹配标记的所有元素,它们的 “class”(类)属性都包含 “title”(标题)。然后在这个类中再次执行搜索。再次搜索会找到文档中所有的<a>标记(被包括在内,而像这样的部分匹配则不被包括在内)。最终,对象被指定为变量 “name”。

可以将对象名称指定为之前创建的列表数组 “results”,但这样会使整个 <a href…> 标记连同内部文本合并为一个元素。通常,只需要文本而无需其他标签。

# Add the object of “name” to the list “results”.
# `<element>.text` extracts the text in the element, omitting the HTML tags.
results.append(name.text)

现在循环可以遍历整个网页源代码,找到上文列出的类,然后将嵌套数据附加到列表中。

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')
driver.get('https://your.url/here?yes=brilliant')
results = []
content = driver.page_source
soup = BeautifulSoup(content)
for element in soup.findAll(attrs={'class': 'title'}):
    name = element.find('a')
    results.append(name.text)

注意,循环后的两个语句是缩进的。循环通过缩进来表示嵌套。所有一致的缩进都是有效的。如果循环没有缩进,会输出 “IndentationError”(缩进错误),并用 “arrow”(箭头)指出错误语句。

导入数据

Python 网络抓取随时需要仔细检查代码

在运行程序时,即使没有提示语法或运行时间错误,但仍然可能存在语义错误。请务必检查是否真的将数据指定给了正确的对象并正确移动到数组。

检查之前获取的数据是否已正确收集,最简单的办法是通过 “print”。因为数组有各种不同的值,通常用简单循环将每个条目分行输出:

for x in results:
   print(x)

在这一点上,“print” 和 “for” 都应该是不言自明的。我们发起循环只是为了快速测试和调试。直接打印结果也完全可以。

print(results)

到现在为止,我们的代码应该是这样的:

driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')
driver.get('https://your.url/here?yes=brilliant')
results = []
content = driver.page_source
soup = BeautifulSoup(content)
for a in soup.findAll(attrs={'class': 'class'}):
    name = a.find('a')
    if name not in results:
        results.append(name.text)
for x in results:
    print(x)

运行以上应用程序不会再显示错误,而调试窗口显示的是以获取的数据。尽管 “print” 用于测试很棒,但对于解析和分析数据就不一定了。

可能您已经发现 “import pandas” 现在仍然是灰色。我们最终会用上这个库。建议删除 “print” 循环,因为我们会通过类似操作,将数据转移到 csv 文件中。

df = pd.DataFrame({'Names': results})
df.to_csv('names.csv', index=False, encoding='utf-8')

这两个新的语句靠的就是 pandas 库。第一个语句会创建变量 “df” 并将对象变成二维数据库表单。“names” 就是我们的名称列,“results” 则是将要打印出的列表。注意 pandas 可以创建多列表单,只是我们的列表不够,无需使用这些参数。

我们的第二个语句将变量数据 “df” 移动到特定文件类型(在这里就是 “csv”)中。第一个参数会给随后的文件指定一个文件名称和一个扩展名。必须添加扩展名,否则 “pandas” 会输出没有扩展名的文件,需要手动更改。可以通过 “index” 为列指定具体编号。用 “encoding” 将数据保存为具体格式。在任何情况下都可以使用 UTF-8。

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')
driver.get('https://your.url/here?yes=brilliant')
results = []
content = driver.page_source
soup = BeautifulSoup(content)
for a in soup.findAll(attrs={'class': 'class'}):
    name = a.find('a')
    if name not in results:
        results.append(name.text)
df = pd.DataFrame({'Names': results})
df.to_csv('names.csv', index=False, encoding='utf-8')

现在输入的数据应该都没有变灰的了,再来运行应用程序,此时会输出 “names.csv” 到项目目录下。注意,还是有 “Guessed At Parser” 提示信息。安装一个第三方解析器就可以解决这个问题,但鉴于这里只是用作教程,默认的 HTML 选项就可以解决问题。

添加清单!

Python 网络过程中通常需要多个数据点

许多网页抓取操作需要抓取多个数据点。例如,只提取电商网站上列出的产品标题几乎没什么用。为了手机有用信息并且从中得出有意义的结论,至少需要两个数据点。

作为教程,我们将做一点略微不同的尝试。由于从同一类抓取数据会得到一个额外的列表,我们应该试着提取不同类的数据,同时维持表单原本的结构。

很明显,我们需要添加一个列表来存储数据。

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')
driver.get('https://your.url/here?yes=brilliant')
results = []
other_results = []
for b in soup.findAll(attrs={'class': 'otherclass'}):
# Assume that data is nested in ‘span’.
    name2 = b.find('span')
    other_results.append(name.text)

由于我们需要从 HTML 的不同不忿提取额外数据,因此我们需要一个额外的循环。我们也可以根据需要再添加“if”条件以控制重复条目。

最终,我们必须更改数据表单的结构。

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')
driver.get('https://your.url/here?yes=brilliant')
results = []
other_results = []
content = driver.page_source
for a in soup.findAll(attrs={'class': 'class'}):
    name = a.find('a')
    if name not in results:
        results.append(name.text)
for b in soup.findAll(attrs={'class': 'otherclass'}):
    name2 = b.find('span')
    other_results.append(name.text)
df = pd.DataFrame({'Names': results, 'Categories': other_results})
df.to_csv('names.csv', index=False, encoding='utf-8')

还可以采用很多其他方式来解决报错问题。用 “empty” 值填入最短的列表来创建字典,创建两个系列再将它们列成表。第三种方法如下:

series1 = pd.Series(results, name = 'Names')
series2 = pd.Series(other_results, name = 'Categories')
df = pd.DataFrame({'Names': series1, 'Categories': series2})
df.to_csv('names.csv', index=False, encoding='utf-8')

因为列表长度不一,数据不会匹配,但如果必须要两个数据点,最简单的办法就是创建两个系列。最终得出的代码如下:

import pandas as pd
from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable')
driver.get('https://your.url/here?yes=brilliant')
results = []
other_results = []
content = driver.page_source
soup = BeautifulSoup(content)
for a in soup.findAll(attrs={'class': 'class'}):
    name = a.find('a')
    if name not in results:
        results.append(name.text)
for b in soup.findAll(attrs={'class': 'otherclass'}):
    name2 = b.find('span')
    other_results.append(name.text)
series1 = pd.Series(results, name = 'Names')
series2 = pd.Series(other_results, name = 'Categories')
df = pd.DataFrame({'Names': series1, 'Categories': series2})
df.to_csv('names.csv', index=False, encoding='utf-8')

运行以上代码会创建一个 csv 文件 “names”,其中包含两列数据。

使用 Python 抓取网页数据的最佳做法

您的第一个网络爬虫现在应该功能齐全了。当然这只是能够执行最基本最简单的任务的 Python 爬虫入门工具,要能够进行严格的数据抓取还需要大力升级。在进行迭代之前,强烈建议尝试以下功能:

  • 创建偶数长度的列表来创建循环,从而创建匹配的数据提取。

  • 同时抓取几个 URL。您也可以采用其他各种方式来实现这一功能。其中最简单的办法就是重复以上代码但每次更改链接。这样的操作非常单调无趣。那么可以建一个循环和一组要访问的链接。

  • 还有一个办法就是创建几个组,分别存储不同的数据集并将其输出到一个有多行的文件中。在电商数据采集任务中,经常需要抓取多种信息。

  • 只要运行功能齐全的网络爬虫,便无需留意浏览器的操作。使用无头版 Chrome 或 Firefox 浏览器,通过以上方法还可以减少加载时间。

  • 创建抓取模式。想想普通用户如何上网浏览,试着将他们的操作自动化。当然需要用到新的库。使用 “import time” 和 “from random import randint” 来创建浏览页面之间的间隔时间。添加 “scrollto()” 或者使用特定按键输入可以切换浏览器。说到创建抓取模式,方法举不胜举。

  • 创建监控流程。特定网站的数据时效性(或者是用户)非常敏感。尝试创建需要运行较长时间的循环,根据设定的时间间隔重新检查某些链接并抓取数据。这样就能保证抓取的总是最新数据。

  • 使用 Python Requests 库。Requests 库是第一个强大的网页抓取工具。通过 Requests 可以优化发送到服务器的 HTTP 方法。

  • 最后,将代理集成到网络抓取工具中。使用特定位置的请求源可以帮助您访问原本可能无法访问的数据。

比起文字版,如果您更喜欢看视频,可以观看我们的内置简化版网页抓取教程。

总结

从此以后,您就可以独立操作了。打造 Python 网络爬虫,抓取大量数据,然后根据分析得出有价值的结论,这个过程复杂又有趣。Python 网络爬虫从入门到实践,看这篇就够了。

如果您对 Oxylabs 的解决方案感兴趣,欢迎了解我们的通用抓取应用程序网络爬虫 API

如果您希望进一步了解代理、先进数据采集工具,或者数据抓取和爬虫的指南,例如电商爬虫 API 指南 ,或者SERP 爬虫 API 指南,欢迎浏览我们的博客。我们准备了许多教程,有大家都感兴趣的抓取时如何避免被封从网站如何提取数据,还有详细介绍什么是代理等等!

关于作者

Gabija Fatenaite

产品营销经理

Gabija Fatenaite 在 Oxylabs 担任一名产品营销经理。成长在视频游戏和互联网家庭背景下的她,多年以后逐渐发现对技术方面的东西越来越感兴趣。因此,如果您发现自己想了解更多关于代理(或视频游戏)方面的信息,请随时联系她。她将会非常乐意解疑答惑。

Oxylabs博客上的所有信息均按“原样”提供,仅供参考。对于您使用Oxylabs博客中包含的任何信息或其中可能链接的任何第三方网站中包含的任何信息,我们不作任何陈述,亦不承担任何责任。在从事任何类型的抓取活动之前,请咨询您的法律顾问,并仔细阅读特定网站的服务条款或取得抓取许可。

在这篇文章


  • 制作网页抓取工具:Python 准备工作

  • 简要介绍 Python 的库

  • 网络驱动程序与浏览器

  • 为 Python 网络爬虫妥善寻找编码环境

  • 导入并使用库

  • 选择 URL

  • 定义对象并建立列表

  • 使用 Python 网络爬虫提取数据

  • 导入数据

  • 添加清单!

  • 使用 Python 抓取网页数据的最佳做法

  • 总结

选择Oxylabs®,业务更上一层楼


联系我们

经过认证的数据中心和上游提供商

关注我们

  • we chat qr code

    微信公众号

    微信号

    oxychina


隐私政策

oxylabs.cn© 2022 保留所有权利©