1. 请求发送
网络爬虫的第一步是发送HTTP请求。Python中的requests
库是发送请求的首选工具,它简单易用且功能强大。
使用requests
库
import requestssession = requests.Session()
session.headers = {"User-Agent": "Mozilla/5.0",# 其他请求头
}
response = session.get("目标URL")
使用Session
对象可以保持会话状态,自动处理Cookie等信息。
自动处理编码
响应内容可能使用不同的编码,正确处理编码是获取准确数据的关键。
解决方案
- 指定编码:根据网页的
meta
标签指定编码。 - 自动检测编码:使用
requests
库的apparent_encoding
属性自动检测编码。
response.encoding = response.apparent_encoding
2. 数据解析
获取到网页内容后,下一步是解析HTML数据。lxml
库的etree
模块是一个强大的HTML解析器。
使用lxml.etree
from lxml import etreehtml = etree.HTML(response.text)
title = html.xpath("//title/text()")[0]
xpath
是lxml.etree
提供的强大工具,可以高效地从HTML中提取数据。
3. URL拼接
在爬取分页数据时,正确拼接URL是必不可少的步骤。Python的urllib.parse
模块提供了urljoin
函数,用于自动完成URL的拼接。
使用urljoin
from urllib.parse import urljoinbase_url = "https://example.com"
relative_url = "/path/to/resource"
full_url = urljoin(base_url, relative_url)
urljoin
能够智能处理绝对路径和相对路径,返回正确的完整URL。
4. 异常处理
网络请求和数据解析过程中可能会遇到各种异常,合理的异常处理能够提高爬虫的健壮性。
添加异常处理
try:response = session.get("目标URL")response.raise_for_status() # 检查响应状态码
except requests.RequestException as e:print(e)
5. 实战案例:抓取《红楼梦》全文
以“诗词名句网”上的《红楼梦》为例,演示如何综合运用上述技术抓取全文。
import requests
from lxml import etree
from urllib.parse import urljoinsession = requests.Session()
main_url = "https://www.shicimingju.com/book/hongloumeng.html"
response = session.get(main_url)
response.encoding = response.apparent_encoding
tree = etree.HTML(response.text)
hrefs = tree.xpath("//div[@class='book-mulu']/ul/li/a/@href")for href in hrefs:detail_url = urljoin(main_url, href)detail_resp = session.get(detail_url)detail_resp.encoding = detail_resp.apparent_encodingdetail_tree = etree.HTML(detail_resp.text)content = detail_tree.xpath("//div[@class='chapter_content']//text()")content = "".join(content).strip().replace(" ", "")# 保存内容到文件
通过上述步骤,我们能够高效地抓取并处理网站数据。构建爬虫时,应注重编码处理、数据解析和URL拼接等关键技术,同时合理使用异常处理来提高爬虫的健壮性和准确性。