Python 爬虫基础入门与核心实现
Python 优势
对于网络爬虫开发来说,Python 有着天然的优势。主要体现在以下两个方面:
1. 抓取网页本身的接口
相比其他静态编程语言(如 Java、C# 与 C++),Python 抓取网页文档的接口更简洁。对比其他动态脚本语言(如 Perl、Shell),Python 的 包提供了较为完整的访问网页文档的 API。
本文介绍 Python 爬虫的基础知识,涵盖语言优势、框架组成、URL 管理、网页下载及解析方法。详细讲解 urllib 库的请求构造、参数传递、Cookie 处理以及 BeautifulSoup 的节点选择与文本提取技巧,并补充了反爬策略应对与道德规范,帮助初学者构建完整的爬虫开发认知体系。

对于网络爬虫开发来说,Python 有着天然的优势。主要体现在以下两个方面:
相比其他静态编程语言(如 Java、C# 与 C++),Python 抓取网页文档的接口更简洁。对比其他动态脚本语言(如 Perl、Shell),Python 的 包提供了较为完整的访问网页文档的 API。
urllib此外,抓取网页有时候需要模拟浏览器的行为,很多网站对于生硬的爬虫抓取都是封杀的。此时,需要模拟 User-Agent 的行为来构造合适的请求(模拟用户登录、模拟 Session/Cookie 的存储和设置)。在 Python 里都有非常优秀的第三方包帮助搞定这些工作(如 Requests、Mechanize)。
抓取的网页通常需要处理,比如过滤 HTML 标签,提取文本等。Python 的 BeautifulSoup 提供了简洁的文档处理功能,能用极短的代码完成大部分文档的处理。
其实以上功能很多语言和工具都能做,但是用 Python 能够干得最快,最干净。
Life is short, you need python.
PS:Python 2.x 和 Python 3.x 有很大不同,本文只讨论 Python 3.x 的爬虫实现方法。
一个标准的爬虫框架通常包含以下核心组件:
内存(Python 内存)
set()set()关系数据库(MySQL)
urls(url, is_crawled)缓存(Redis)
setset大型互联网公司,由于缓存数据库的性能高,所以一般把 URL 存储在缓存数据库中。小型公司,一般把 URL 存储在内存中,要永久存储,则存储到关系数据库中。
将 URL 对应的网页下载到本地,存储成一个文件或字符串。
新建 baidu.py,内容如下:
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
buff = response.read()
html = buff.decode("utf8")
print(html)
命令行中执行 python baidu.py,则可以打印出获取到的页面。
上面的代码可以修改为使用 Request 对象,以便更灵活地控制请求头:
import urllib.request
request = urllib.request.Request('http://www.baidu.com')
response = urllib.request.urlopen(request)
buff = response.read()
html = buff.decode("utf8")
print(html)
新建 baidu2.py,内容如下:
import urllib.request
import urllib.parse
url = 'http://www.baidu.com'
values = {'name': 'voidking', 'language': 'Python'}
data = urllib.parse.urlencode(values).encode(encoding='utf-8', errors='ignore')
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
request = urllib.request.Request(url=url, data=data, headers=headers, method='GET')
response = urllib.request.urlopen(request)
buff = response.read()
html = buff.decode("utf8")
print(html)
要查看请求是否真的携带了参数,需使用 Fiddler 等抓包工具监听数据。
为了处理 Cookie 等会话信息,可以使用 HTTPCookieProcessor:
import urllib.request
import http.cookiejar
# 创建 cookie 容器
cj = http.cookiejar.CookieJar()
# 创建 opener
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
# 给 urllib.request 安装 opener
urllib.request.install_opener(opener)
# 请求
request = urllib.request.Request('http://www.baidu.com/')
response = urllib.request.urlopen(request)
buff = response.read()
html = buff.decode("utf8")
print(html)
print(cj)
在实际开发中,建议增加异常处理机制(如 try...except)来应对网络超时或连接失败的情况。
从网页中提取出有价值的数据和新的 URL 列表。
为了实现解析器,可以选择使用正则表达式、html.parser、BeautifulSoup、lxml 等。其中,正则表达式基于模糊匹配,而另外三种则是基于 DOM 结构化解析。这里推荐选择 BeautifulSoup,因为它对新手友好且容错率高。
pip install beautifulsoup4。import bs4
print(bs4.__version__)
from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
</body>
</html>"""
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.prettify())
print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.title.parent.name)
print(soup.p)
print(soup.p['class'])
print(soup.find_all('a'))
print(soup.find('a'))
print(soup.find(class_='title'))
print(soup.find(id="link3"))
print(soup.find('p', class_='title'))
for link in soup.find_all('a'):
print(link.get('href'))
如果出现警告,根据提示,在创建 BeautifulSoup 对象时指定解析器即可:
soup = BeautifulSoup(html_doc, 'html.parser')
print(soup.get_text())
import re
link_node = soup.find('a', href=re.compile(r"til"))
print(link_node)
在编写爬虫程序时,除了技术实现,还需注意以下几点:
robots.txt 协议,避免抓取禁止爬取的页面。try-except 捕获 URLError 或 HTTPError。通过上述步骤,可以构建一个基础且健壮的 Python 爬虫系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 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
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online