导言
随着互联网的发展,大量的数据被存储在网络上,而我们需要从中获取有用的信息。Python 作为一种功能强大且易于学习的编程语言,被广泛用于网络爬虫的开发。本文将详细介绍 Python 爬虫所需的技术及其原理,并提供相关的代码案例。
1. HTTP 请求与响应
在爬取网页数据之前,我们需要了解 HTTP 协议,它是在 Web 上进行数据交互的基础协议。HTTP 请求与响应是爬虫工作的基础,我们需要了解它们的结构和交互方式。
本文介绍了 Python 爬虫的基础原理、HTTP 请求响应机制、网页解析技术(正则、XPath、BeautifulSoup)、常用框架(Scrapy、Selenium)以及反爬虫应对策略。通过实例演示了数据提取与存储流程,并强调了遵守网站协议和法律法规的重要性。

随着互联网的发展,大量的数据被存储在网络上,而我们需要从中获取有用的信息。Python 作为一种功能强大且易于学习的编程语言,被广泛用于网络爬虫的开发。本文将详细介绍 Python 爬虫所需的技术及其原理,并提供相关的代码案例。
在爬取网页数据之前,我们需要了解 HTTP 协议,它是在 Web 上进行数据交互的基础协议。HTTP 请求与响应是爬虫工作的基础,我们需要了解它们的结构和交互方式。
HTTP 请求由请求行、请求头和请求体组成。其中,请求行包括请求方法、请求的 URL 和协议版本;请求头包含了用于描述请求的各种信息;请求体是可选项,用于传输请求的数据。下面是一个 HTTP 请求的示例:
GET /path/to/resource HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
...
在 Python 中,我们可以使用 requests 库发送 HTTP 请求。下面是一个使用 requests 库发送 GET 请求的示例代码:
import requests
url = 'http://www.example.com'
try:
response = requests.get(url, timeout=5)
print(response.text)
except Exception as e:
print(f"Request failed: {e}")
HTTP 响应由响应行、响应头和响应体组成。响应行包含了响应的状态码和状态消息;响应头包含了用于描述响应的各种信息;响应体是实际返回的数据。下面是一个 HTTP 响应的示例:
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1234
...
<html>
...
</html>
在 Python 中,我们可以使用 requests 库获取 HTTP 响应。下面是一个获取 HTTP 响应的示例代码:
import requests
url = 'http://www.example.com'
try:
response = requests.get(url)
print(response.status_code)
print(response.headers)
print(response.text)
except Exception as e:
print(f"Error: {e}")
爬虫需要从网页中提取有用的数据,而网页通常采用 HTML 或 XML 格式存储。为了解析网页,我们可以使用以下几种技术。
正则表达式是一种强大的文本匹配技术,我们可以使用它来提取网页中的数据。例如,我们可以使用正则表达式提取 HTML 中的所有链接。
下面是一个使用正则表达式提取 HTML 中的链接的示例代码:
import re
html = '<a href="http://example.com">Example</a>'
links = re.findall(r'<a href="([^"]+)">([^<]+)</a>', html)
for link in links:
print(link[0], link[1])
XPath 是一种用于在 XML 文档中定位节点的语言,它可以与 HTML 文档一样使用。我们可以使用 XPath 提取网页中的数据。例如,我们可以使用 XPath 提取 HTML 中的所有链接。
下面是一个使用 XPath 提取 HTML 中的链接的示例代码(需要使用 lxml 库):
from lxml import etree
html = '<a href="http://www.example.com">Example</a>'
tree = etree.HTML(html)
links = tree.xpath('//a')
for link in links:
print(link.get('href'), link.text)
BeautifulSoup 是一个 HTML 和 XML 解析库,提供了简单灵活的 API。我们可以使用 BeautifulSoup 解析网页并提取数据。
下面是一个使用 BeautifulSoup 解析 HTML 并提取链接的示例代码(需要使用 beautifulsoup4 库):
from bs4 import BeautifulSoup
html = '<a href="http://www.example.com">Example</a>'
soup = BeautifulSoup(html, 'html.parser')
links = soup.find_all('a')
for link in links:
print(link.get('href'), link.text)
有了解析后的 HTML 内容,我们可以根据具体的需求,使用 CSS 选择器或 XPath 表达式来定位和提取所需的数据。
下面示范了使用 BeautifulSoup 提取网页中所有超链接的代码:
links = soup.select('a')
for link in links:
href = link['href']
text = link.get_text()
print(href, text)
在这个示例中,我们使用 soup.select() 方法配合 CSS 选择器字符串 'a',选取网页中所有的 <a> 标签。然后使用 link['href'] 和 link.get_text() 分别提取超链接的 URL 和文字内容。
爬虫获取到数据后,通常需要将其保存起来供后续处理和分析。常见的存储方式有保存为文件(如 CSV、JSON 格式),或者存储到数据库中。
以下是一个使用 csv 库将提取的数据保存为 CSV 文件的示例代码:
import csv
data = [['url', 'text'], [href, text]]
with open('output.csv', 'w', newline='', encoding='utf-8') as file:
writer = csv.writer(file)
writer.writerows(data)
在这个示例中,我们首先准备好要保存的数据 data,其中包含了提取到的 URL 和文字内容。然后使用 csv.writer() 和 writerows() 方法将数据写入到 CSV 文件中。
在实际的爬虫开发中,我们通常会使用一些爬虫框架,它们提供了更高级别的抽象和更方便的功能。以下是一些常用的 Python 爬虫框架。
Scrapy 是一个快速、可扩展且高级别的 Web 爬取框架。它提供了强大的抓取功能和数据处理能力,使爬虫开发更加高效。下面是一个使用 Scrapy 爬取网页的示例代码:
import scrapy
class MySpider(scrapy.Spider):
name = 'example.com'
start_urls = ['http://www.example.com']
def parse(self, response):
# 处理响应
# 提取数据
# 发送更多请求
pass
BeautifulSoup 和 requests 的组合是另一种常用的爬虫开发方式。使用 BeautifulSoup 解析网页,使用 requests 发送 HTTP 请求。
下面是一个使用 BeautifulSoup 和 requests 爬取网页的示例代码:
import requests
from bs4 import BeautifulSoup
url = 'http://www.example.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 处理页面,提取数据
Selenium 是一种自动化浏览器工具,可以模拟浏览器行为。它通常与浏览器驱动一起使用,如 ChromeDriver。使用 Selenium 可以解决一些 JavaScript 渲染的网页爬取问题。
下面是一个使用 Selenium 模拟浏览器爬取网页的示例代码(需要使用 selenium 库):
from selenium import webdriver
driver = webdriver.Chrome('path/to/chromedriver')
driver.get('http://www.example.com')
# 处理页面,提取数据
driver.quit()
除了了解基本的爬虫工作原理,还需要掌握一些相关的技术,以便更好地应对各种复杂情况。下面是几个常用的技术要点:
为了防止网站屏蔽爬虫,我们可以在发送 HTTP 请求时设置 User-Agent 头部,将其伪装成浏览器的请求。这样可以减少被服务器识别为爬虫的概率。
Python requests 库可以通过设置 headers 参数来添加自定义的 HTTP 头部。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}
response = requests.get(url, headers=headers)
为了防止被爬虫抓取数据,网站可能会采取一些反爬虫策略,如限制请求频率、设置验证码、使用动态加载等。对于这些情况,我们可以采取以下解决方法:
time.sleep() 函数。有些网站需要登录后才能获取到所需的数据。在这种情况下,我们可以通过模拟登录行为,发送 POST 请求并记录登录后的 Session 信息,以便后续的数据访问。
下面是一个使用 requests 库模拟登录的示例代码:
import requests
login_url = 'https://example.com/login'
data = {
'username': 'your_username',
'password': 'your_password'
}
response = requests.post(login_url, data=data)
session = response.cookies
data_url = 'https://example.com/data'
response = requests.get(data_url, cookies=session)
data = response.text
在这个示例中,我们首先发送 POST 请求模拟登录,将用户名和密码作为表单数据 data 发送给登录页面 login_url,并保存返回的 Session 信息。
然后我们可以使用 requests.get() 方法发送 GET 请求,同时将保存的 Session 信息作为 cookies 参数传入,以便获取登录后的数据。
在编写爬虫时,必须遵守目标网站的 robots.txt 协议。该文件定义了哪些页面允许爬虫抓取,哪些禁止抓取。忽略此协议可能导致法律风险或 IP 被封禁。
建议在发起请求前检查 https://domain.com/robots.txt,确保不违反网站的抓取规则。
为了更好地演示 Python 爬虫的技术和原理,我们选取了简书网站作为示例。我们将爬取简书网站中的热门文章列表,提取出每篇文章的标题、作者和链接。
以下是完整的实现代码:
import requests
from bs4 import BeautifulSoup
import time
# 发送 HTTP 请求
url = 'https://www.jianshu.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
try:
response = requests.get(url, headers=headers, timeout=10)
html = response.text
except Exception as e:
print(f"Failed to fetch page: {e}")
exit()
# 解析 HTML 内容
soup = BeautifulSoup(html, 'html.parser')
# 提取数据
articles = soup.select('.note-list li')
data = []
for article in articles:
try:
title_elem = article.select('a.title')[0]
author_elem = article.select('.name')[0]
title = title_elem.string.strip() if title_elem.string else ''
author = author_elem.string.strip() if author_elem.string else ''
href = 'https://www.jianshu.com' + title_elem['href']
data.append([title, author, href])
except IndexError:
continue
time.sleep(1) # 控制请求频率
# 数据存储
import csv
with open('jianshu_articles.csv', 'w', newline='', encoding="utf-8") as file:
writer = csv.writer(file)
writer.writerow(['Title', 'Author', 'Link'])
writer.writerows(data)
print("Data saved successfully.")
在这个示例中,我们首先发送 GET 请求获取简书网站的 HTML 内容,然后使用 BeautifulSoup 库进行解析。
接着,我们使用 CSS 选择器字符串 .note-list li 选取所有文章的外层容器,并使用 CSS 选择器和字典键值对的方式提取文章的标题、作者和链接。
最后,我们采用 CSV 格式将提取的数据保存到了名为 jianshu_articles.csv 的文件中,并添加了简单的错误处理和延时机制。
本文详细介绍了 Python 爬虫所需的技术及其原理,包括 HTTP 请求与响应、网页解析技术和爬虫框架。通过掌握这些技术,我们可以有效地开发出强大且高效的 Python 爬虫。希望本文能对你理解和掌握 Python 爬虫有所帮助。
请注意,在进行网络爬虫时,需要遵守网站的使用条款,并遵守相关法律法规。同时,合理使用爬虫技术,不对网络资源进行滥用和破坏。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online