实现思路
- 网页抓取:使用
urllib.request
模块发送HTTP请求获取网页内容。它是Python标准库中用于处理URL的模块,能方便地发起请求并获取响应。
- 页面编码识别:使用
chardet
库(非标准库,但简单易用,可通过pip安装)来自动识别网页的编码格式。因为不同网页可能使用不同编码,手动指定容易出错。
- 解析网页:使用
html.parser
模块来解析HTML内容,它是Python标准库中专门用于解析HTML的模块,能以事件驱动的方式处理HTML文档。
- 数据持久化:使用
io
模块中的open
函数(Python标准的文件操作方式)将解析后的数据写入本地文件,以实现数据的存储。
- 异常处理:使用
try - except
语句捕获urllib.request
在请求过程中可能抛出的异常,如网络连接失败、HTTP错误等。
关键代码片段
import urllib.request
import chardet
from html.parser import HTMLParser
import io
class WebCrawler:
def __init__(self, url, output_file):
self.url = url
self.output_file = output_file
def fetch_page(self):
try:
response = urllib.request.urlopen(self.url)
page_content = response.read()
encoding = chardet.detect(page_content)['encoding']
return page_content.decode(encoding, errors='ignore')
except urllib.request.URLError as e:
print(f"网络请求出现异常: {e}")
return None
def parse_page(self, page_content):
if page_content:
class MyHTMLParser(HTMLParser):
def handle_data(self, data):
with io.open(self.output_file, 'a', encoding='utf - 8') as f:
f.write(data + '\n')
parser = MyHTMLParser()
parser.feed(page_content)
if __name__ == "__main__":
url = "http://example.com"
output_file = "output.txt"
crawler = WebCrawler(url, output_file)
page_content = crawler.fetch_page()
crawler.parse_page(page_content)
使用的标准库模块及其原因
urllib.request
:用于发送HTTP请求并获取网页响应,是Python标准库中处理URL请求的基础模块,功能全面且易于使用。
html.parser
:是Python标准库中解析HTML的模块,以事件驱动方式处理HTML文档,适合简单的HTML解析需求,使用方便且无需额外安装。
io
:提供了通用的I/O操作接口,open
函数是Python文件操作的基础,能方便地实现数据的持久化存储到本地文件。