嘿,各位数据侠客们,是不是经常眼巴巴地看着别人家的数据报表、自动化的信息聚合,心里痒痒的?别急,今天咱就把这层神秘面纱给你掀了,让你看看Python爬虫到底有多好玩、多强大!
说白了,爬虫就是个“互联网复制粘贴小能手”,只不过咱们玩的是自动化、批量化。而Python之所以能成为爬虫界的“扛把子”,全靠它背后那一大堆好用又免费的“兵器库”——也就是我们今天要重点介绍的常用模块。
准备好了吗?系好安全带,咱们发车了!
第一站:requests —— 你的网络“瑞士军刀”
如果说爬虫是去别人家“串门”,那 requests 库就是你敲门的那个“手”。它简单、优雅,是HTTP请求的绝对主力。
它能干啥?
简单说,就是你告诉它一个网址(URL),它就能帮你把网页的源代码“拿”回来,就像你在浏览器里按F12看到的那些HTML代码一样。
为啥是它?
因为它比Python自带的 urllib 库不知道高到哪里去了,代码写起来那叫一个清爽!
来,上硬菜!(完整示例)
假设咱们想偷偷去看看豆瓣读书上《三体》的页面长啥样(学习交流,绝无恶意!)。
import requests
# 目标URL,也就是我们要“敲门”的地址
url = 'https://book.douban.com/subject/2567698/'
# 非常重要的步骤:设置请求头,把自己伪装成一个“浏览器”,避免被网站直接拒之门外
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 用requests的get方法,轻轻敲一下门
response = requests.get(url, headers=headers)
# 检查一下门开了没有(状态码200表示成功)
if response.status_code == 200:
# 把门后的“风景”(网页源代码)打印出来
print(response.text)
else:
print(f'哎呀,门没开!状态码:{response.status_code}')
看,就这么几行代码,一个最简单的爬虫就诞生了! 是不是感觉已经摸到爬虫的门槛了?
第二站:BeautifulSoup —— 你的“信息提炼师”
用 requests 拿回来的是一大锅“原材料”(HTML代码),里面什么都有,标签、属性、文本混在一起。这时候,你就需要一个“厨师”来帮你把里面的“肉”挑出来。这个厨师就是 BeautifulSoup。
它能干啥?
它能够解析HTML/XML文档,并提供了非常简单易用的方法来查找、遍历和修改文档树,帮你精准定位并提取你想要的那部分数据。
为啥是它?
语法接近人类语言,学习成本极低,对新手极其友好,堪称“爬虫界的良心”。
接着炖肉!(完整示例)
接着上面的例子,现在我们拿到了《三体》页面的HTML,我们想提取出它的书名和评分。
from bs4 import BeautifulSoup
import requests
url = 'https://book.douban.com/subject/2567698/'
headers = {
'User-Agent': '你的浏览器User-Agent'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
# 创建BeautifulSoup对象,指定解析器为'lxml'(需要额外安装:pip install lxml)
soup = BeautifulSoup(response.text, 'lxml')
# 找书名。通过F12检查元素,发现书名在 <h1> 标签里
# find() 方法找到第一个匹配的标签
title_tag = soup.find('h1')
# 获取标签内的文本内容
title = title_tag.get_text().strip() if title_tag else '未找到书名'
# 找评分。发现评分在一个 class 为 ‘rating_num’ 的 strong 标签里
# 可以用 .find() 配合 class_ 参数
rating_tag = soup.find('strong', class_='rating_num')
rating = rating_tag.get_text().strip() if rating_tag else '暂无评分'
print(f'书名:《{title}》')
print(f'评分:{rating}')
else:
print('请求失败')
运行一下,你是不是就能看到《三体》的书名和评分被完美地“提炼”出来了?这种感觉,就像在沙滩上捡到了闪闪发光的贝壳,爽不爽?
第三站:lxml & XPath —— 快就一个字!
BeautifulSoup 虽然好用,但在处理超大型文档时,速度可能会稍慢。这时候,lxml 和它的好搭档 XPath 就闪亮登场了。
它能干啥?
lxml 是一个高性能的HTML/XML解析器。而 XPath 则是一门在XML文档中查找信息的语言,它路径表达式非常强大,能像定位文件路径一样精准定位节点。
为啥是它?
速度飞快,定位精准,尤其适合处理复杂结构和大量数据。
上高速了!(完整示例)
还是同样的目标,我们用 lxml 和 XPath 来抓取一次。
import requests
from lxml import etree
url = 'https://book.douban.com/subject/2567698/'
headers = {
'User-Agent': '你的浏览器User-Agent'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
# 用 lxml 的 etree 来解析HTML
html = etree.HTML(response.text)
# 使用XPath表达式来定位元素
# 书名:在唯一的 h1 标签里
title = html.xpath('//h1/text()')[0].strip()
# 评分:在class为‘rating_num’的strong标签的文本里
rating = html.xpath('//strong[@class="rating_num"]/text()')[0].strip()
print(f'书名:《{title}》')
print(f'评分:{rating}')
else:
print('请求失败')
看,代码同样简洁!XPath 的 //strong[@class="rating_num"]/text() 意思就是:“在整个文档里,找到所有 class 属性为 rating_num 的 strong 标签,并获取它的文本内容。” 是不是有种指哪打哪的爽快感?
第四站:Selenium —— 当爬虫“活了”
有些网站,它的数据不是一开始就躺在HTML里的,而是通过JavaScript代码动态加载的。你用 requests 直接请求,拿到的是个“空壳”。这时候,前三位大哥就有点力不从心了。
怎么办?请出我们的“影帝”—— Selenium。
它能干啥?
它可以直接操控浏览器(如Chrome, Firefox),模拟真人的点击、滚动、输入等操作。能看到JS动态生成的内容,能搞定复杂的登录验证,几乎无所不能。
为啥是它?
因为它不是一个人在战斗,它背后有一个真正的浏览器!能解决最棘手的动态内容问题。
见证奇迹的时刻!(完整示例)
假设我们要爬取一个需要滚动到底部才会加载更多内容的网站。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# 创建一个Chrome浏览器驱动对象
# 注意:你需要先下载对应浏览器版本的WebDriver,并放在系统路径或代码指定路径
driver = webdriver.Chrome()
try:
# 打开目标网址
driver.get('https://某个动态加载的网站.com')
# 等待页面某个关键元素加载完成(更智能的方式)
# WebDriverWait(driver, 10).until(
# EC.presence_of_element_located((By.TAG_NAME, "body"))
# )
# 模拟滚动到页面底部,以触发加载
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2) # 等待2秒,让新内容加载
# 现在,页面的所有内容(包括JS生成的)都在这里了
page_source = driver.page_source
# 接下来,你就可以用BeautifulSoup或者lxml来解析 page_source 了!
# soup = BeautifulSoup(page_source, 'lxml')
# ... (你的提取逻辑)
print("动态内容获取成功!")
finally:
# 最后一定要关闭浏览器,不然它会在后台一直开着
driver.quit()
Selenium 就像给你的爬虫装上了眼睛和手,让它从“脚本”升级成了“机器人”。当然,威力越大,责任也越大,它的速度相对较慢,资源消耗也大,算是你的“核武器”,关键时刻再用。
综合实战:打造你的第一个迷你爬虫项目
理论说得再多,不如亲手干一票!我们来个综合小案例:爬取某个技术博客网站(假设为 example-tech-blog.com)首页的文章标题和链接。
这个案例会用到 requests + BeautifulSoup 这对黄金搭档。
import requests
from bs4 import BeautifulSoup
def scrape_tech_blog():
url = 'https://example-tech-blog.com' # 请替换为真实且允许爬取的网站
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36'
}
try:
response = requests.get(url, headers=headers, timeout=5) # 设置超时时间
response.raise_for_status() # 如果状态码不是200,抛出异常
soup = BeautifulSoup(response.content, 'lxml') # 用 response.content 获取字节内容,避免编码问题
# 假设文章列表在 class 为 ‘post-list’ 的div里,每个文章标题都在 h2 > a 标签里
# **重点:这里的选择器需要你根据目标网站的实际结构进行调整!**
articles = soup.find_all('div', class_='post-list') # 可能需要调整
blog_posts = []
for article in articles:
# 在每个文章块里找 h2 标签下的 a 标签
title_link = article.find('h2').find('a') if article.find('h2') else None
if title_link:
title = title_link.get_text().strip()
link = title_link.get('href') # 获取href属性,即链接
# 处理相对链接(如果链接不是以http开头)
if link and not link.startswith('http'):
link = requests.compat.urljoin(url, link) # 拼接成绝对链接
blog_posts.append({'title': title, 'link': link})
# 打印结果
for idx, post in enumerate(blog_posts, 1):
print(f"{idx}. {post['title']}")
print(f" 链接:{post['link']}\n")
except requests.exceptions.RequestException as e:
print(f"网络请求出错啦:{e}")
except Exception as e:
print(f"解析过程中出现未知错误:{e}")
if __name__ == '__main__':
scrape_tech_blog()
运行这个脚本前,请务必:
- 将
url替换成一个真实存在的、并且允许爬取的网站。 - 通过浏览器F12工具,仔细分析该网站的结构,修改
soup.find_all和后续的查找逻辑,使其匹配目标网站。 - 遵守网站的
robots.txt协议,做个有道德的爬虫玩家!
结语:授人以渔,送你几条“军规”
恭喜你,看到这里,你已经不再是爬虫小白了!你已经掌握了四大神器的基本用法。但在你兴冲冲地去“浪”之前,老司机还得再啰嗦几句:
- 遵守规则(Robots.txt):爬之前,先看看网站根目录下的
/robots.txt文件,人家不让爬的地方,千万别硬闯。 - 温柔一点(设置延迟):别用你的脚本对别人网站发起每秒几百次的疯狂请求,那叫攻击,不叫爬虫。用
time.sleep()歇一歇,做个有礼貌的访客。 - 伪装到位(User-Agent & Headers):一定要设置请求头,把自己伪装成浏览器,这是最基本的“社交礼仪”。
- 法律与道德:爬取的数据请用于学习和合法用途,尊重版权和用户隐私,不要触碰法律红线。
爬虫的世界广阔无边,还有 Scrapy 这样的专业框架,有IP代理、验证码识别等高级话题等着你去探索。但万变不离其宗,掌握了这几个核心模块,你就已经拿到了入场券。

被折叠的 条评论
为什么被折叠?



