Python爬虫:开启数据获取的奇妙之旅

Python爬虫,即使用Python语言编写程序,通过网络爬虫技术从网站上自动获取数据。Python因其简洁的语法和强大的库支持,成为了编写爬虫程序的首选语言之一。开启数据获取的奇妙之旅,首先需要了解一些基本概念和步骤。
一、基本概念
1. 网络爬虫:网络爬虫是一种自动化的网络数据采集程序,它可以在互联网上自主地浏览和抓取网页内容。
2. HTTP协议:HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,所有的网络爬虫都需要了解HTTP协议,以便与网站进行交互。
3. HTML:HTML(超文本标记语言)是构建网页的标准标记语言,网络爬虫需要解析HTML,以便提取所需数据。
4. CSS选择器:CSS选择器是一种用来定位HTML元素的方法,网络爬虫经常使用CSS选择器来提取所需数据。
5. 正则表达式:正则表达式是一种用于匹配字符串的强大工具,网络爬虫经常使用正则表达式来提取复杂的数据格式。
二、爬虫步骤
1. 分析目标网站:了解目标网站的结构和内容,确定需要抓取的数据类型。
2. 选择合适的库:Python有许多用于爬虫的库,如Requests、BeautifulSoup、Scrapy等。根据需求选择合适的库。
3. 发送HTTP请求:使用Requests库发送HTTP请求,获取目标网页的HTML内容。

相关内容:

lass="xiangguan" id="content">

一、爬虫初印象


在信息爆炸的时代,数据就像一座蕴藏无限价值的宝藏,等待着我们去挖掘。而 Python 爬虫,就是我们开启这座宝藏大门的神奇钥匙。简单来说,Python 爬虫是一种按照一定规则,自动抓取互联网上信息的程序。它就像一个不知疲倦的小助手,能够在浩瀚的网络世界中快速、准确地获取我们需要的数据。

爬虫的应用场景极为广泛,在数据挖掘领域,它能从海量网页中提取有价值的信息,助力企业发现潜在商业机会;市场分析时,通过抓取竞争对手网站数据,分析市场趋势和对手动态,为企业制定战略提供依据;舆情监测中,实时收集社交媒体、新闻网站等平台的信息,帮助企业和政府及时了解公众情绪和舆论走向,以便做出恰当决策。

二、Python 爬虫为什么这么牛

看到这里,你可能会好奇,在众多编程语言中,为什么 Python 能成为爬虫领域的宠儿呢?这背后,离不开 Python 自身独特的优势。

首先,Python 拥有丰富的库和框架,这简直就是爬虫开发者的宝藏库。比如requests库,它让发送 HTTP 请求变得轻而易举,几行代码就能搞定。就像你想去商店买东西,requests库就是你的购物车,帮你轻松获取网页这个 “商品” 。还有BeautifulSoup库,它擅长解析 HTML 和 XML 文档,能够精准地从网页中提取出你想要的数据,仿佛是一个超级数据筛选器,把杂乱的网页数据整理得井井有条 。而Scrapy框架,则是构建大型爬虫项目的得力助手,它提供了一套完整的解决方案,从请求的发送到数据的存储,都能高效处理,大大提高了开发效率。

其次,Python 的语法简洁易懂,非常接近自然语言。即使你是编程小白,也能快速上手。对比其他编程语言,Python 就像是一位亲切的朋友,用简单直白的话语与你交流,而不是像有些语言那样,使用复杂的语法规则,让人望而生畏。这使得编写爬虫程序不再是一件高难度的事情,降低了学习成本,让更多人能够投身于爬虫开发中。

另外,强大的社区支持也是 Python 爬虫的一大优势。在 Python 社区里,汇聚着来自世界各地的开发者,大家积极分享自己的经验、代码和解决方案。当你在开发爬虫过程中遇到问题时,只要在社区里提问,往往能迅速得到热心网友的帮助。而且,社区里还有丰富的学习资源,无论是教程、文档还是开源项目,都能让你不断提升自己的爬虫技能。

三、爬虫的工作原理大揭秘

了解了 Python 爬虫的强大之处,你是不是迫不及待地想知道它是如何工作的呢?接下来,我们就深入探讨一下爬虫的工作原理,揭开它神秘的面纱。

(一)HTTP 请求与响应

在爬虫的世界里,HTTP 请求与响应就像是一场信息的传递之旅。HTTP,即超文本传输协议,是互联网上应用最为广泛的一种网络协议 ,它就像一个通用的语言,让客户端(比如我们的爬虫程序)和服务器之间能够顺畅地交流。

当我们的爬虫想要获取某个网页的数据时,它会向服务器发送一个 HTTP 请求。这个请求就像是一封精心撰写的信件,包含了请求方法(如 GET、POST 等)、请求的 URL(也就是网页的地址,就像收件人的地址)以及一些其他的信息,如请求头(包含客户端的一些信息,比如浏览器类型、操作系统等,就像是信件中的寄件人信息) 。例如,当我们使用requests库发送一个 GET 请求时,代码可能是这样的:

import requests

url = 'https://www.example.com' # 目标网页的URL

response = requests.get(url) # 发送GET请求

服务器在接收到请求后,会根据请求的内容进行处理,并返回一个 HTTP 响应。响应同样包含多个部分,状态行(包含 HTTP 版本、状态码和状态消息,状态码就像是一个结果代码,告诉我们请求是否成功,常见的状态码 200 表示请求成功,404 表示请求的资源不存在,500 表示服务器内部错误等)、响应头(包含服务器的一些信息,如服务器类型、内容类型等)和响应体(这就是我们真正想要的数据,比如网页的 HTML 内容,就像是信件中的正文) 。我们可以通过以下方式获取响应的状态码和内容:

status_code = response.status_code  # 获取响应状态码

content = response.text # 获取响应内容(以文本形式)

通过理解 HTTP 请求与响应的机制,我们就为爬虫开发打下了坚实的基础,因为这是获取网页数据的第一步,也是关键的一步。

(二)网页解析技术

当我们成功获取到网页的响应后,接下来的关键任务就是从这一堆 HTML 或 XML 代码中提取出我们真正需要的数据,这就需要用到网页解析技术。下面,我们就来介绍几种常用的网页解析技术。

1. 正则表达式

正则表达式是一种用于描述字符串模式的强大工具,它就像是一把万能钥匙,能够在复杂的文本中精准地找到我们需要的信息。它使用特定的字符和字符组合来定义一个规则,然后根据这个规则在文本中进行匹配和查找。比如,我们要从一段文本中提取所有的邮箱地址,就可以使用正则表达式来实现。

正则表达式的基本语法包含一些特殊的字符和元字符。例如,d表示匹配任意一个数字,w表示匹配字母、数字、下划线 ,*表示匹配前面的元素零次或多次,+表示匹配前面的元素一次或多次等等。举个例子,如果我们要匹配一个简单的电话号码,假设电话号码的格式是 3 位区号加上 8 位电话号码,中间用短横线连接,我们可以使用这样的正则表达式:d{3}-d{8} 。在 Python 中,我们可以使用re库来操作正则表达式。下面是一个用正则表达式提取网页链接的示例代码:

import re

import requests

url = 'https://www.example.com'

response = requests.get(url)

content = response.text

# 定义正则表达式模式,匹配网页中的链接

pattern = re.compile(r'<a href="(.*?)">')

links = pattern.findall(content)

for link in links:

print(link)

在这个例子中,我们首先发送 HTTP 请求获取网页内容,然后使用正则表达式定义了一个模式,用于匹配 HTML 中<a>标签的href属性值,也就是网页链接。最后,通过findall方法找到所有匹配的链接并打印出来。正则表达式的灵活性和强大功能,使得它在处理一些复杂或不规则的数据时表现出色,但它的语法相对复杂,需要一定的学习和实践才能熟练掌握。

2. XPath

XPath 是一门在 HTML 或 XML 文档中查找信息的语言,它提供了一种简洁、高效的方式来定位和提取文档中的元素和属性。XPath 的语法规则基于路径表达式,就像在文件系统中通过路径来找到文件一样,我们可以通过 XPath 表达式在网页的文档结构中找到我们需要的数据。

例如,//p表示选择所有class属性为content的p元素。//表示从文档的任意位置开始查找,p是要选择的元素标签,是一个谓词,用于进一步筛选元素,只有class属性为content的p元素才会被选中。下面是一个使用 XPath 提取网页标题的示例代码,我们需要借助lxml库来支持 XPath 操作:

from lxml import etree

import requests

url = 'https://www.example.com'

response = requests.get(url)

content = response.text

# 将网页内容解析为XML树

html = etree.HTML(content)

# 使用XPath表达式提取网页标题

title = html.xpath('//title/text()')

print(title)

在这个代码中,我们首先使用requests库获取网页内容,然后通过etree.HTML将内容解析为 XML 树结构。接着,使用 XPath 表达式//title/text()来选择title元素并获取其文本内容,最后打印出网页标题。XPath 在处理复杂结构的网页时具有明显的优势,它能够清晰地定位到我们需要的数据,提高数据提取的准确性和效率。

3. BeautifulSoup

BeautifulSoup 是 Python 的一个 HTML/XML 解析库,它可以帮助我们从网页的 HTML 或 XML 文档中轻松地提取数据。它的 API 设计得非常人性化,简单易用,就像是一个贴心的助手,让我们能够快速地找到并提取出想要的数据。

使用 BeautifulSoup 时,我们首先需要创建一个BeautifulSoup对象,将网页内容传递给它进行解析。然后,就可以使用它提供的各种方法来查找和提取元素。例如,find_all方法可以查找所有符合条件的元素,find方法则查找第一个符合条件的元素。下面是一个使用 BeautifulSoup 提取网页中所有图片链接的示例代码:

from bs4 import BeautifulSoup

import requests

url = 'https://www.example.com'

response = requests.get(url)

content = response.text

# 创建BeautifulSoup对象

soup = BeautifulSoup(content, 'html.parser')

# 查找所有的img标签,并获取其src属性值

img_links = for img in soup.find_all('img')]

for link in img_links:

print(link)

在这段代码中,我们先获取网页内容,然后创建BeautifulSoup对象并指定解析器为html.parser。接着,使用find_all方法找到所有的img标签,再通过索引获取每个img标签的src属性值,也就是图片链接。最后,将所有的图片链接打印出来。BeautifulSoup 的简单易用和灵活的 API,使得它成为了很多 Python 爬虫开发者的首选解析工具。

四、爬虫开发必备武器库

在 Python 爬虫开发的旅程中,我们需要借助一些强大的工具,它们就像是我们的得力武器,帮助我们顺利地完成数据抓取任务。下面,就为大家介绍几个常用的爬虫开发库和框架。

(一)requests 库

requests库是 Python 爬虫中用于发送 HTTP 请求的重要工具,它的出现让 HTTP 请求的发送变得极为简单。

在使用requests库时,最常见的操作就是发送 GET 和 POST 请求。发送 GET 请求时,我们可以使用requests.get()方法,例如:

import requests

url = 'https://httpbin.org/get'

response = requests.get(url)

print(response.text)

在这个例子中,我们向https://httpbin.org/get发送了一个 GET 请求,并打印出了响应的文本内容。https://httpbin.org是一个专门用于测试 HTTP 请求的网站,非常适合我们学习和调试requests库的使用。

如果我们需要向 URL 添加查询参数,可以通过传递一个字典给params参数来实现。比如:

import requests

url = 'https://httpbin.org/get'

params = {'key1': 'value1', 'key2': 'value2'}

response = requests.get(url, params=params)

print(response.url)

运行这段代码,你会发现打印出的 URL 后面多了?key1=value1&key2=value2,这就是我们添加的查询参数。

而发送 POST 请求时,我们使用requests.post()方法,并通过data参数传入要发送的数据,示例如下:

import requests

url = 'https://httpbin.org/post'

data = {'key1': 'value1', 'key2': 'value2'}

response = requests.post(url, data=data)

print(response.text)

这里,我们向https://httpbin.org/post发送了一个 POST 请求,并携带了data中的数据。

在实际爬虫过程中,设置请求头也是非常重要的。有些网站会根据请求头来判断请求是否来自合法的客户端,如果请求头不符合要求,可能会拒绝我们的请求。我们可以通过headers参数来设置请求头,比如模拟浏览器访问:

import requests

url = 'https://www.example.com'

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}

response = requests.get(url, headers=headers)

print(response.text)

在这个例子中,我们设置了User - Agent请求头,模拟了 Chrome 浏览器访问目标网站。通过合理设置请求头,我们可以让爬虫更好地伪装自己,提高数据抓取的成功率。

(二)BeautifulSoup 库

BeautifulSoup库是 Python 爬虫中用于解析 HTML 和 XML 文档的利器,它能够帮助我们轻松地从网页中提取所需的数据。

在使用BeautifulSoup库之前,我们需要先安装它。打开命令行工具,输入以下命令即可完成安装:

pip install beautifulsoup4

安装完成后,我们就可以在代码中使用它了。使用时,首先要创建一个BeautifulSoup对象,将网页内容传递给它进行解析。例如:

from bs4 import BeautifulSoup

import requests

url = 'https://www.example.com'

response = requests.get(url)

content = response.text

# 创建BeautifulSoup对象

soup = BeautifulSoup(content, 'html.parser')

这里,我们使用requests库获取了网页内容,然后创建了一个BeautifulSoup对象soup,并指定解析器为html.parser。html.parser是 Python 标准库中的 HTML 解析器,使用起来比较方便。当然,BeautifulSoup还支持其他解析器,如lxml和html5lib,lxml解析器速度快,功能强大,html5lib解析器则具有更好的容错性,我们可以根据实际需求选择合适的解析器。

创建好BeautifulSoup对象后,就可以使用它提供的各种方法来查找和提取元素了。比如,find()方法用于查找第一个符合条件的元素,find_all()方法用于查找所有符合条件的元素。假设我们要查找网页中所有的链接,可以这样做:

# 查找所有的a标签,并获取其href属性值

links = for a in soup.find_all('a')]

for link in links:

print(link)

在这段代码中,我们使用find_all('a')找到了所有的<a>标签,然后通过索引获取每个<a>标签的href属性值,也就是链接。

另外,select()方法可以通过 CSS 选择器来查找元素,这在处理一些复杂的网页结构时非常有用。例如,要查找类名为content的p元素中的所有p元素,可以使用以下代码:

# 通过CSS选择器查找元素

content_p = soup.select('.content p')

for p in content_p:

print(p.get_text())

这里,.content p是 CSS 选择器,表示选择类名为content的元素下的所有p元素。get_text()方法用于获取元素的文本内容。通过这些方法,我们可以灵活地从网页中提取出各种所需的数据。

(三)lxml 库

lxml库是一个高效的 Python 库,专门用于解析和操作 XML 和 HTML 文档。它基于 C 语言编写的libxml2和libxslt,因此处理速度非常快,非常适合大规模数据解析任务。

lxml库的优势之一在于它对 XPath 的强大支持。XPath 是一种用于在 XML 文档中查找信息的语言,同样适用于 HTML 文档。它通过路径表达式来选择节点,使得我们可以用简单的路径表达式从文档中提取出特定的元素或文本内容。

在使用lxml库之前,需要先安装它,安装命令如下:

pip install lxml

安装完成后,我们就可以使用它来解析网页和使用 XPath 提取数据了。下面是一个使用lxml库解析网页并提取所有链接的示例代码:

from lxml import etree

import requests

url = 'https://www.example.com'

response = requests.get(url)

content = response.text

# 将网页内容解析为XML树

html = etree.HTML(content)

# 使用XPath表达式提取所有链接

links = html.xpath('//a/@href')

for link in links:

print(link)

在这个示例中,我们首先使用requests库获取网页内容,然后通过etree.HTML()将内容解析为 XML 树结构。接着,使用 XPath 表达式//a/@href来选择所有<a>标签的href属性,也就是网页中的链接。最后,遍历并打印出所有的链接。

再比如,如果我们要提取网页中某个特定类名的p元素中的文本内容,可以这样做:

# 使用XPath提取特定类名p元素中的文本内容

texts = html.xpath('//p/text()')

for text in texts:

print(text.strip())

这里,//p/text()表示选择所有class属性为specific-class的p元素,并获取其文本内容。strip()方法用于去除文本两端的空白字符。通过lxml库和 XPath 的结合使用,我们能够更加高效、准确地从网页中提取出所需的数据,尤其在处理复杂结构的网页时,其优势更加明显。

(四)Selenium 库

Selenium库是一个用于自动化浏览器行为的工具,它在 Python 爬虫中主要用于处理动态网页。在如今的互联网世界中,很多网页都采用了大量的 JavaScript 技术来实现动态交互效果,传统的爬虫技术很难直接获取这些动态加载的数据。而Selenium库就像是一个虚拟的浏览器,可以模拟用户在浏览器中的各种操作,如点击、输入、页面跳转等,从而帮助我们获取到动态网页中的数据。

Selenium库需要与浏览器驱动配合使用,不同的浏览器有不同的驱动程序。以 Chrome 浏览器为例,我们需要下载ChromeDriver,并将其添加到系统路径中。下载地址可以在ChromeDriver 官方网站找到,下载时要注意选择与自己 Chrome 浏览器版本对应的驱动程序。

安装Selenium库可以使用以下命令:

pip install selenium

安装完成后,我们就可以开始使用Selenium库来操作浏览器了。下面是一个简单的示例,展示了如何使用Selenium打开百度首页,并在搜索框中输入关键词进行搜索:

from selenium import webdriver

# 创建Chrome浏览器实例

driver = webdriver.Chrome()

# 打开百度首页

driver.get('https://www.baidu.com')

# 找到搜索框并输入关键词

search_box = driver.find_element_by_id('kw')

search_box.send_keys('Python爬虫')

# 找到搜索按钮并点击

search_button = driver.find_element_by_id('su')

search_button.click()

# 打印页面标题

print(driver.title)

# 关闭浏览器

driver.quit()

在这个示例中,我们首先创建了一个Chrome浏览器实例driver,然后使用driver.get()方法打开了百度首页。接着,通过find_element_by_id()方法找到了搜索框和搜索按钮,并分别进行了输入关键词和点击操作。最后,打印出了当前页面的标题,并关闭了浏览器。

在实际应用中,我们还可以使用Selenium进行更多复杂的操作,如处理弹窗、切换窗口、等待页面元素加载等。例如,当我们需要等待某个元素加载完成后再进行操作时,可以使用显式等待:

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.common.by import By

# 创建Chrome浏览器实例

driver = webdriver.Chrome()

# 打开网页

driver.get('https://www.example.com')

# 等待元素加载,最长等待10秒

wait = WebDriverWait(driver, 10)

element = wait.until(EC.presence_of_element_located((By.ID,'specific-element-id')))

# 对找到的元素进行操作

element.click()

# 关闭浏览器

driver.quit()

在这段代码中,我们使用了WebDriverWait和expected_conditions来实现显式等待。WebDriverWait会在指定的时间内不断检查某个条件是否满足,直到条件满足或超时。
EC.presence_of_element_located()表示等待某个元素出现在页面中。通过这种方式,我们可以确保在进行操作时,页面元素已经加载完成,提高爬虫的稳定性和可靠性。

(五)Scrapy 框架

Scrapy框架是一个强大的 Python 爬虫框架,它为我们提供了一套完整的爬虫解决方案,使得开发高效、可扩展的爬虫变得更加容易。

Scrapy框架具有诸多特点和优势。首先,它采用了异步处理机制,使用Twisted异步网络库来处理网络请求,这使得它能够高效地处理大量并发请求,大大减少了请求的延迟,提高了爬虫的速度。其次,Scrapy内置了强大的选择器,支持 XPath 和 CSS 选择器,我们可以方便地从 HTML、XML 等格式的文档中提取数据。再者,Scrapy具有高度的可扩展性,其组件化设计使得开发者可以轻松地添加自定义组件,如中间件、管道等,以满足特定的需求。此外,Scrapy默认遵守robots.txt协议,确保了爬虫行为符合网站的抓取规则,避免了不必要的法律风险。

下面我们来看看如何使用Scrapy框架创建项目和爬虫。首先,需要安装Scrapy框架,安装命令如下:

pip install scrapy

安装完成后,我们就可以创建一个新的Scrapy项目了。在命令行中执行以下命令:

scrapy startproject myproject

这会在当前目录下创建一个名为myproject的项目,项目结构如下:

myproject/

├── myproject/

│ ├── items.py

│ ├── pipelines.py

│ ├── settings.py

│ └── spiders/

│ └── __init__.py

└── scrapy.cfg

其中,myproject目录是项目的核心目录,items.py用于定义数据结构,pipelines.py用于定义数据处理管道,settings.py用于配置项目相关的设置,spiders目录用于存放所有的爬虫类文件,scrapy.cfg是项目的配置文件。

接下来,我们在spiders目录下创建一个爬虫。在命令行中进入myproject目录,执行以下命令:

scrapy genspider myspider example.com

这会在spiders目录下创建一个名为myspider.py的爬虫文件,内容如下:

import scrapy

class MyspiderSpider(scrapy.Spider):

name ='myspider'

allowed_domains =

start_urls =

def parse(self, response):

pass

在这个爬虫文件中,name是爬虫的名称,allowed_domains指定了允许爬取的域名,start_urls是爬虫开始爬取的 URL 列表。parse()方法是爬虫的核心方法,用于解析响应内容,提取数据,并生成新的请求。

例如,我们要爬取example.com网站上所有文章的标题和链接,可以这样修改parse()方法:

import scrapy

class MyspiderSpider(scrapy.Spider):

name ='myspider'

allowed_domains =

start_urls =

def parse(self, response):

for article in response.css('p.article'):

yield {

'title': article.css('h2.title::text').get(),

'link': article.css('a::attr(href)').get()

}

在这个例子中,我们使用 CSS 选择器找到了所有类名为article的p元素,然后从中提取出文章的标题和链接,并通过yield返回数据。通过这样的方式,我们就可以使用Scrapy框架快速构建一个功能强大的爬虫,高效地抓取网站上的数据。

五、爬虫开发实战演练

理论知识掌握得再多,也不如实际动手操作一番。接下来,我们就通过一个具体的实战案例,来深入了解 Python 爬虫的开发过程。

(一)目标设定

我们以爬取某电商网站的商品信息为例,假设我们要爬取的是京东网站上笔记本电脑的商品信息,包括商品名称、价格、评论数等。在开始爬取之前,我们需要先对目标网站进行分析。打开京东网站,搜索 “笔记本电脑”,观察网页的结构和数据分布。我们可以发现,商品信息都包含在一个个的<p>标签中,每个商品的名称在<a>标签内,价格在<span>标签内,评论数也在对应的<span>标签内。同时,我们注意到网页是通过分页展示商品的,每一页的 URL 有一定的规律,例如第一页的 URL 是
https://search.jd.com/Search?keyword=笔记本电脑&page=1,第二页是
https://search.jd.com/Search?keyword=笔记本电脑&page=3 ,这里的page参数表示页码,且奇数页对应不同的页面内容。通过分析,我们明确了数据的位置和网页的规律,为后续的代码编写做好了准备。

(二)代码实现

接下来,我们就开始编写爬虫代码。在这个案例中,我们将使用requests库发送 HTTP 请求,BeautifulSoup库解析网页,pandas库处理和存储数据。

首先,确保你已经安装了所需的库,如果没有安装,可以使用以下命令进行安装:

pip install requests beautifulsoup4 pandas

以下是完整的爬虫代码:

import requests

from bs4 import BeautifulSoup

import pandas as pd

# 定义请求头,模拟浏览器访问

headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'

}

# 定义函数,获取网页内容

def get_page(url):

try:

response = requests.get(url, headers=headers)

if response.status_code == 200:

return response.text

else:

print(f'请求失败,状态码:{response.status_code}')

return None

except requests.RequestException as e:

print(f'请求发生异常:{e}')

return None

# 定义函数,解析网页内容,提取商品信息

def parse_page(html):

if html:

soup = BeautifulSoup(html, 'html.parser')

products = soup.find_all('p', class_='gl-item')

for product in products:

# 提取商品名称

name = product.find('p', class_='p-name').find('a').get('title').strip()

# 提取商品价格

price = product.find('p', class_='p-price').find('i').text.strip()

# 提取商品评论数

comment = product.find('p', class_='p-commit').find('a').text.strip()

yield {

'商品名称': name,

'商品价格': price,

'评论数': comment

}

# 定义主函数,控制爬取过程

def main():

base_url = '
https://search.jd.com/Search?keyword=笔记本电脑&page={}'

all_products =

# 爬取前5页的数据

for page in range(1, 11, 2):

url = base_url.format(page)

html = get_page(url)

products = parse_page(html)

all_products.extend(products)

# 将数据转换为DataFrame格式

df = pd.DataFrame(all_products)

# 保存数据到CSV文件

df.to_csv('笔记本电脑商品信息.csv', index=False, encoding='utf-8-sig')

if __name__ == '__main__':

main()

代码实现过程逐步讲解如下:

  1. 发送请求:在get_page函数中,我们使用requests.get方法向目标 URL 发送 GET 请求,并传递了请求头headers,以模拟浏览器访问,避免被网站识别为爬虫而拒绝请求。如果请求成功(状态码为 200),则返回网页的文本内容;否则,打印错误信息并返回None 。
  1. 解析网页:parse_page函数中,我们使用BeautifulSoup将获取到的网页内容进行解析。通过find_all方法找到所有包含商品信息的<p>标签,然后再在每个标签内,通过find方法找到对应的标签,提取出商品名称、价格和评论数等信息,并通过yield返回一个生成器,以便逐行处理数据,节省内存。
  1. 提取数据:在main函数中,我们通过循环生成不同页码的 URL,并调用get_page和parse_page函数,获取并解析每一页的商品信息,将提取到的所有商品信息存储在all_products列表中。
  1. 存储数据:最后,我们使用pandas库将数据转换为DataFrame格式,并通过to_csv方法将数据保存到名为笔记本电脑商品信息.csv的 CSV 文件中,index=False表示不保存行索引,encoding='utf-8-sig'用于确保中文字符能够正确保存,避免出现乱码问题。

(三)结果展示

运行上述爬虫代码后,我们可以在当前目录下找到生成的笔记本电脑商品信息.csv文件。打开该文件,你会看到类似以下的数据:

商品名称

商品价格

评论数

联想小新 Pro16 2024 款 英特尔 Evo 平台 13 代酷睿 i5 16 英寸高性能轻薄本笔记本电脑 (i5-13500H 16G 1T RTX4050 2.5K 120Hz 高刷屏)

8499.00

500 + 条评价

惠普暗影精灵 9 13 代英特尔酷睿 i9 16.1 英寸游戏笔记本电脑 (i9-13900HX 16G 1T RTX4060 240Hz 高色域)

9499.00

2 万 + 条评价

戴尔游匣 G16 2023 16 英寸游戏笔记本电脑 (英特尔 13 代酷睿 i7-13650HX 16G 1T RTX4060 240Hz 高刷)

9499.00

5000 + 条评价

...

...

...

我们也可以在代码中添加打印语句,在运行过程中实时查看获取的数据:

# 定义函数,解析网页内容,提取商品信息

def parse_page(html):

if html:

soup = BeautifulSoup(html, 'html.parser')

products = soup.find_all('p', class_='gl-item')

for product in products:

# 提取商品名称

name = product.find('p', class_='p-name').find('a').get('title').strip()

# 提取商品价格

price = product.find('p', class_='p-price').find('i').text.strip()

# 提取商品评论数

comment = product.find('p', class_='p-commit').find('a').text.strip()

product_info = {

'商品名称': name,

'商品价格': price,

'评论数': comment

}

print(product_info)

yield product_info

这样,在运行爬虫时,每提取到一条商品信息,就会在控制台打印出来,让我们更直观地看到爬虫的工作成果。通过以上的实战演练,我们成功地使用 Python 爬虫获取了电商网站上的商品信息,并进行了存储和展示,相信你对 Python 爬虫的开发过程也有了更深入的理解和掌握。

六、爬虫进阶技巧

在掌握了 Python 爬虫的基本开发技能后,想要进一步提升爬虫的效率和稳定性,就需要了解一些进阶技巧。这些技巧能够帮助我们更好地应对复杂的网络环境和网站的反爬虫策略,实现更高效、更可靠的数据抓取。

(一)应对反爬虫策略

在爬虫与反爬虫的较量中,网站为了保护自身数据和服务器资源,会采用各种反爬虫策略,而我们则需要相应的反反爬虫技巧来突破这些限制。

1. IP 限制

许多网站会监测 IP 的访问频率,如果发现某个 IP 在短时间内频繁访问,就会限制该 IP 的访问,甚至直接封禁。应对 IP 限制,一种常见的方法是使用代理 IP。代理 IP 就像是我们与目标网站之间的中间人,我们通过代理 IP 发送请求,目标网站看到的是代理 IP 的地址,而不是我们真实的 IP 地址。这样,当一个代理 IP 因为访问频繁被限制时,我们可以切换到其他代理 IP 继续访问。市面上有很多提供代理 IP 服务的平台,我们可以购买这些服务,也可以自己搭建代理 IP 池。搭建代理 IP 池时,可以从一些免费的代理 IP 网站收集代理 IP,然后编写代码对这些 IP 进行验证和筛选,确保其可用性。例如,使用requests库向代理 IP 发送请求,测试其响应速度和稳定性 ,将可用的代理 IP 存储在数据库中,供爬虫程序使用。

2. 验证码

验证码是网站常用的反爬虫手段之一,它要求用户输入图片中的字符、完成滑块拼图、进行文字识别或算术题等,以此来区分人类用户和爬虫程序。对于简单的图片字母数字验证码,我们可以借助一些图像识别库,如pytesseract来识别验证码。首先,安装pytesseract库,并配置好 Tesseract OCR 引擎。然后,使用 Python 的图像处理库,如PIL(Python Imaging Library)对验证码图片进行预处理,例如灰度化、降噪、二值化等操作,以提高识别准确率。对于复杂的验证码,如滑块验证码、文字识别验证码等,可以通过接入专业的打码平台来解决。打码平台通常有大量的人工或经过训练的算法来识别验证码,我们只需要将验证码图片发送给打码平台,平台会返回识别结果。在使用打码平台时,需要注意平台的稳定性和准确性,以及费用问题。

3. User - Agent 检测

网站会通过检测请求头中的 User - Agent 来判断请求是否来自正常的浏览器。User - Agent 包含了浏览器类型、版本、操作系统等信息,如果请求的 User - Agent 不符合常见浏览器的特征,就可能被识别为爬虫。为了绕过 User - Agent 检测,我们可以在爬虫程序中随机切换 User - Agent。可以预先收集一些常见浏览器的 User - Agent 字符串,存储在一个列表中。然后,在每次发送请求时,从列表中随机选择一个 User - Agent 设置到请求头中,模拟不同浏览器的访问行为。例如:

import requests

import random

user_agents =

url = 'https://www.example.com'

headers = {'User-Agent': random.choice(user_agents)}

response = requests.get(url, headers=headers)

通过这种方式,我们可以增加爬虫的伪装性,降低被网站检测到的风险。

(二)分布式爬虫

在面对大规模数据抓取任务时,单机爬虫的性能往往会受到限制,这时就需要引入分布式爬虫技术。

分布式爬虫是指将爬虫任务分布到多个节点(通常是多台服务器或多个进程)上并行执行,利用集群的计算能力来提高数据抓取的效率。它的原理是将整个爬虫任务分解为多个子任务,每个子任务由一个节点负责处理。这些节点通过网络进行通信和协作,共同完成数据抓取任务。例如,一个分布式爬虫系统可以由一个主节点(Master)和多个从节点(Slave)组成。主节点负责管理任务队列,将待爬取的 URL 分配给各个从节点。从节点接收到任务后,进行网页抓取和数据解析,并将结果返回给主节点。主节点还负责监控从节点的状态,当某个从节点出现故障时,能够及时重新分配任务,确保整个爬虫系统的稳定性和可靠性。

Scrapy - Redis 是一个常用的分布式爬虫框架,它是 Scrapy 和 Redis 的结合。Redis 是一个高性能的内存数据库,它在 Scrapy - Redis 中主要承担任务队列和去重集合的角色。Scrapy - Redis 利用 Redis 的列表(List)数据结构作为任务队列,将待爬取的 URL 存储在队列中。各个爬虫节点从队列中获取 URL 进行爬取,完成爬取后再将新发现的 URL 加入队列,实现任务的分布式处理。同时,利用 Redis 的集合(Set)数据结构进行 URL 去重,确保每个 URL 只被爬取一次。

Scrapy - Redis 的优势明显,它能够充分利用多台机器的计算资源,大大提高数据抓取的速度,尤其适用于大规模数据抓取场景。而且,由于任务队列和去重集合存储在 Redis 中,不同爬虫节点之间可以共享数据,避免了重复爬取,提高了爬虫的效率和准确性。在实际应用中,电商数据采集、搜索引擎数据抓取等场景都可以使用 Scrapy - Redis 框架来实现高效的数据抓取。例如,要采集某电商平台上所有商品的信息,由于商品数量庞大,单机爬虫很难在短时间内完成任务,这时就可以使用 Scrapy - Redis 搭建分布式爬虫系统,通过多台机器并行工作,快速获取所需数据。

(三)数据清洗与存储

从网页上抓取到的数据往往存在各种问题,如重复数据、缺失值、数据格式不一致等,这些问题会影响后续的数据分析和应用,因此需要进行数据清洗。

去除重复数据是数据清洗的重要环节。可以使用 Python 的集合(Set)数据结构来实现简单的去重操作。集合中的元素是唯一的,将数据添加到集合中时,重复的数据会自动被忽略。对于复杂的数据结构,如字典列表,可以通过计算数据的哈希值来判断数据是否重复。计算每个数据项的哈希值,将哈希值作为键存储在字典中,如果某个数据项的哈希值已经存在于字典中,说明该数据项是重复的,可以将其删除。

处理缺失值也是必不可少的步骤。对于数值型数据的缺失值,可以采用均值、中位数或众数来填充。例如,对于一组商品价格数据,如果存在缺失值,可以计算其他非缺失价格的均值,用均值来填充缺失值。对于文本型数据的缺失值,可以根据具体情况进行处理,如用空字符串填充,或者根据上下文信息进行推断填充。

在数据格式转换方面,经常需要将不同格式的数据统一为所需的格式。比如,将日期字符串转换为日期类型,以便进行日期相关的计算和分析。在 Python 中,可以使用datetime模块来处理日期和时间。例如,将字符串'2023-10-01'转换为datetime对象:

from datetime import datetime

date_str = '2023-10-01'

date_obj = datetime.strptime(date_str, '%Y-%m-%d')

数据存储也是爬虫开发中不容忽视的一环。常见的数据存储方式有文件存储、数据库存储等。文件存储适用于数据量较小、对数据查询和管理要求不高的场景。可以将数据存储为 CSV、JSON、XML 等格式的文件。例如,使用pandas库将数据保存为 CSV 文件,如前文爬取电商商品信息的案例中,就使用了df.to_csv('笔记本电脑商品信息.csv', index=False, encoding='utf-8-sig')将数据保存到 CSV 文件中。

数据库存储则更适合数据量较大、需要频繁查询和更新数据的场景。常见的关系型数据库有 MySQL、PostgreSQL 等,非关系型数据库有 MongoDB、Redis 等。关系型数据库适合存储结构化数据,它具有严格的数据结构和表关系,能够保证数据的一致性和完整性,适用于需要进行复杂查询和事务处理的场景。非关系型数据库则更灵活,能够处理半结构化和非结构化数据,具有高扩展性和高性能,适合存储海量数据和对读写性能要求较高的场景。例如,MongoDB 适合存储文档型数据,如爬虫抓取到的网页内容、用户评论等;Redis 适合存储缓存数据、计数器数据等,它的数据存储在内存中,读写速度非常快。在选择数据存储方式时,需要根据数据的特点、应用场景以及性能要求等因素综合考虑,选择最适合的存储方式。

七、爬虫的法律与道德边界

在探索 Python 爬虫技术的过程中,我们不能忽视一个重要的方面,那就是爬虫的法律与道德边界。技术是一把双刃剑,爬虫技术在为我们获取数据带来便利的同时,如果使用不当,也可能引发一系列法律和道德问题。

在法律层面,爬虫涉及到多个法律法规。从《网络安全法》来看,它对网络运行安全和个人信息保护等方面做出了明确规定。如果爬虫程序导致对方网站崩溃,影响了网站的正常运行,就可能违反网络运行安全方面的规定 ;若爬取的是用户个人信息,那么就可能违反个人信息保护的相关条款。在 2024 年 9 月入库的 “丁某提供侵入计算机信息系统程序案” 中,丁某购得专门用于入侵某短视频服务器的爬虫软件代理权,在未经用户、平台授权的情况下,非法获取用户底层数据,最终被依法判处有期徒刑一年六个月,缓刑二年。这一案例充分体现了法律对非法使用爬虫技术的严厉制裁。

另外,从《反不正当竞争法》的角度,其中规定了诚实信用原则和商业道德,以及对商业秘密的保护。如果爬虫不遵守 Robots 协议,随意抓取网站数据,可能会被认定为违反诚实信用原则和商业道德;若通过技术手段获取了网站不想被访问的商业秘密信息,就可能触犯该法中关于商业秘密保护的条款。例如,大众点评诉百度案中,百度通过爬虫技术抓取大众点评网的用户评论和商户信息用于自身产品,虽辩称符合 Robots 协议,但法院仍依据《反不正当竞争法》认定其构成不正当竞争,因为这种 “搭便车” 行为损害了大众点评的竞争优势,破坏了市场竞争秩序 。

从道德层面来说,我们也应该遵守基本的道德准则。Robots 协议就是一种道德层面的行业规范,它就像是网站的 “家规”,明确告知爬虫哪些页面可以抓取,哪些页面禁止抓取 。我们的爬虫程序应该尊重网站的意愿,自觉遵守 Robots 协议,避免抓取禁止访问的页面。如果为了获取数据而不择手段,无视网站的规定和他人的权益,不仅会损害自身的声誉,也会破坏整个互联网的数据生态环境。

为了确保爬虫行为的合法性和道德性,我们在开发和使用爬虫时,一定要先仔细研读目标网站的 Robots 协议,严格按照协议规定进行数据抓取。同时,要明确自己的爬虫目的,确保是用于合法的研究、分析等正当用途,而不是用于非法牟利、侵犯他人隐私等不良行为。如果对某些数据的获取存在法律疑虑,最好事先咨询专业的法律人士,获取合法的授权或许可。只有在法律和道德的框架内使用爬虫技术,我们才能充分发挥它的优势,为我们的工作和生活带来积极的价值,同时避免陷入不必要的法律纠纷和道德困境。

八、未来已来:爬虫的发展趋势

随着科技的飞速发展,Python 爬虫技术也在不断演进,展现出令人期待的发展趋势。

在人工智能与爬虫技术的融合方面,已经取得了显著进展。智能爬虫应运而生,它借助人工智能的强大力量,能够实现自适应学习。比如,当目标网站的结构发生变化时,智能爬虫能够自动识别这些改变,并相应地调整抓取策略。就像一个经验丰富的探险家,能够根据地形的变化灵活调整前进的路线。在模式识别上,智能爬虫可以精准识别网页上复杂的模式,无论是动态加载的内容,还是嵌套的框架以及复杂的用户交互,都难不倒它。这使得它在面对复杂和动态的网页时,依然能够高效地提取数据,为后续的分析和应用提供有力支持。

深度学习技术也在为爬虫的发展注入新的活力。在网页内容识别上,深度学习模型能够更准确地理解网页中的语义信息,提取出关键数据。例如,在爬取新闻网站时,能够自动识别出新闻的标题、正文、作者、发布时间等重要信息,大大提高了数据提取的准确性和效率。对于动态内容抓取,深度学习辅助的爬虫可以通过分析页面的动态变化规律,精准地抓取到动态加载的数据,解决了传统爬虫在面对动态网页时的难题。在应对反爬虫机制方面,深度学习模型可以通过对大量数据的学习,分析网站的反爬虫策略,从而指导爬虫模拟正常用户的行为,巧妙地绕过反爬虫机制,提高爬虫的稳定性和成功率。

在大数据时代,爬虫技术与大数据的结合也将更加紧密。随着数据量的不断增长,对爬虫的性能和效率提出了更高的要求。未来的爬虫将能够更高效地处理海量数据,实现快速的数据采集和传输。同时,爬虫与大数据分析工具的集成也将更加深入,采集到的数据可以直接进入大数据分析平台,进行实时的分析和挖掘,为企业和组织提供更及时、准确的决策支持。

随着物联网的兴起,万物互联的时代已经到来。未来,爬虫技术可能会扩展到物联网设备的数据采集领域,从各种智能设备中获取数据,进一步拓宽数据的来源和应用场景。在智能城市建设中,爬虫可以从交通摄像头、环境监测设备等物联网设备中获取数据,为城市的规划、管理和优化提供数据依据。

Python 爬虫技术的未来充满了无限的可能性。它将在人工智能、大数据、物联网等技术的推动下,不断创新和发展,为我们获取和利用数据带来更多的便利和价值,也将在更多的领域发挥重要作用,推动各行业的数字化转型和发展。

九、写在最后

Python 爬虫技术就像一把神奇的钥匙,为我们打开了数据世界的大门。通过这篇文章,我们从爬虫的基本概念出发,深入了解了它的工作原理,掌握了常用的开发工具和库,还通过实战演练积累了宝贵的经验,并且探讨了爬虫的法律道德边界以及未来的发展趋势。

如果你对 Python 爬虫感兴趣,那就不要犹豫,赶紧动手实践吧!在学习和实践的过程中,你可能会遇到各种各样的问题,但不要害怕,每一次解决问题都是一次成长的机会。希望大家都能在 Python 爬虫的世界里探索出属于自己的精彩,挖掘出数据背后的无限价值。

如果你在学习 Python 爬虫的过程中有什么有趣的经验、遇到的问题或者独特的见解,欢迎在评论区留言分享,让我们一起交流,共同进步 !

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章