跳到主要内容
Python 爬虫核心技术原理与实战解析 | 极客日志
Python 算法
Python 爬虫核心技术原理与实战解析 Python 爬虫的基础原理、HTTP 请求响应机制、网页解析技术(正则、XPath、BeautifulSoup)、常用框架(Scrapy、Selenium)以及反爬虫应对策略。通过实例演示了数据提取与存储流程,并强调了遵守网站协议和法律法规的重要性。
战神 发布于 2025/2/7 更新于 2026/7/22 37 浏览导言
随着互联网的发展,大量的数据被存储在网络上,而我们需要从中获取有用的信息。Python 作为一种功能强大且易于学习的编程语言,被广泛用于网络爬虫的开发。本文将详细介绍 Python 爬虫所需的技术及其原理,并提供相关的代码案例。
1. HTTP 请求与响应
在爬取网页数据之前,我们需要了解 HTTP 协议,它是在 Web 上进行数据交互的基础协议。HTTP 请求与响应是爬虫工作的基础,我们需要了解它们的结构和交互方式。
1.1 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,*
在 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} " )
1.2 HTTP 响应
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} " )
2. 网页解析技术 爬虫需要从网页中提取有用的数据,而网页通常采用 HTML 或 XML 格式存储。为了解析网页,我们可以使用以下几种技术。
2.1 正则表达式 正则表达式是一种强大的文本匹配技术,我们可以使用它来提取网页中的数据。例如,我们可以使用正则表达式提取 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 ])
2.2 XPath 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)
2.3 BeautifulSoup 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)
2.4 提取数据 有了解析后的 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 和文字内容。
2.5 数据存储与再处理 爬虫获取到数据后,通常需要将其保存起来供后续处理和分析。常见的存储方式有保存为文件(如 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 文件中。
3. 爬虫框架 在实际的爬虫开发中,我们通常会使用一些爬虫框架,它们提供了更高级别的抽象和更方便的功能。以下是一些常用的 Python 爬虫框架。
3.1 Scrapy Scrapy 是一个快速、可扩展且高级别的 Web 爬取框架。它提供了强大的抓取功能和数据处理能力,使爬虫开发更加高效。下面是一个使用 Scrapy 爬取网页的示例代码:
import scrapy
class MySpider (scrapy.Spider):
name = 'example.com'
start_urls = ['http://www.example.com' ]
def parse (self, response ):
pass
3.2 BeautifulSoup + requests 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' )
3.3 Selenium Selenium 是一种自动化浏览器工具,可以模拟浏览器行为。它通常与浏览器驱动一起使用,如 ChromeDriver。使用 Selenium 可以解决一些 JavaScript 渲染的网页爬取问题。
下面是一个使用 Selenium 模拟浏览器爬取网页的示例代码(需要使用 selenium 库):
from selenium import webdriver
driver = webdriver.Chrome('path/to/chromedriver' )
driver.get('http://www.example.com' )
driver.quit()
4. 其他关键技术 除了了解基本的爬虫工作原理,还需要掌握一些相关的技术,以便更好地应对各种复杂情况。下面是几个常用的技术要点:
4.1 User-Agent 伪装 为了防止网站屏蔽爬虫,我们可以在发送 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)
4.2 反爬虫策略与解决方法 为了防止被爬虫抓取数据,网站可能会采取一些反爬虫策略,如限制请求频率、设置验证码、使用动态加载等。对于这些情况,我们可以采取以下解决方法:
限制请求频率 :可以通过设置合适的时间间隔来控制请求的频率,避免过快访问网站。使用 time.sleep() 函数。
验证码识别 :可以使用第三方的验证码识别库(如 Tesseract-OCR)来自动识别并输入验证码。
动态加载页面 :对于使用 JavaScript 动态加载的页面,可以使用 Selenium 库模拟浏览器行为进行处理。
代理 IP 池 :当遇到 IP 被封禁时,可以使用代理 IP 池来切换出口 IP。
4.3 网页登录与 Session 管理 有些网站需要登录后才能获取到所需的数据。在这种情况下,我们可以通过模拟登录行为,发送 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 参数传入,以便获取登录后的数据。
4.4 Robots 协议与合规性 在编写爬虫时,必须遵守目标网站的 robots.txt 协议。该文件定义了哪些页面允许爬虫抓取,哪些禁止抓取。忽略此协议可能导致法律风险或 IP 被封禁。
建议在发起请求前检查 https://domain.com/robots.txt,确保不违反网站的抓取规则。
5. 实例:爬取简书网站文章信息 为了更好地演示 Python 爬虫的技术和原理,我们选取了简书网站作为示例。我们将爬取简书网站中的热门文章列表,提取出每篇文章的标题、作者和链接。
import requests
from bs4 import BeautifulSoup
import time
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()
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 爬虫有所帮助。
请注意,在进行网络爬虫时,需要遵守网站的使用条款,并遵守相关法律法规。同时,合理使用爬虫技术,不对网络资源进行滥用和破坏。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online