Python 7 个网络爬虫实战案例及源码解析
本文通过 7 个经典案例,演示如何使用 Python 进行网页数据采集。涵盖静态页面解析、动态渲染处理及数据持久化存储。内容包含完整源码解析、反爬策略应对及伦理规范,适合初学者系统学习。
Python 爬虫实战教程涵盖豆瓣、猫眼、高校名单、天气、当当网、糗事百科及微博等 7 个典型案例。使用 Requests、BeautifulSoup、正则、Lxml 及 Selenium 等技术抓取网页数据并保存至本地文件。内容包含完整源码解析、反爬策略应对及伦理规范,适合初学者系统学习数据采集流程与基础实现方法。

本文通过 7 个经典案例,演示如何使用 Python 进行网页数据采集。涵盖静态页面解析、动态渲染处理及数据持久化存储。内容包含完整源码解析、反爬策略应对及伦理规范,适合初学者系统学习。
本案例使用 BeautifulSoup 库爬取豆瓣电影 Top250 的电影名称、评分和评价人数等信息,并将这些信息保存到 CSV 文件中。
import requests
from bs4 import BeautifulSoup
import csv
# 请求 URL
url = 'https://movie.douban.com/top250'
# 请求头部
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.36'
}
# 解析页面函数
def parse_html(html):
soup = BeautifulSoup(html, 'lxml')
movie_list = soup.find('ol', class_='grid_view').find_all('li')
for movie in movie_list:
title = movie.find('div', class_='hd').find('span', class_='title').get_text()
rating_num = movie.find('div', class_='star').find('span', class_='rating_num').get_text()
comment_num = movie.find('div', class_='star').find_all('span')[-1].get_text()
writer.writerow([title, rating_num, comment_num])
# 保存数据函数
def save_data():
f = open('douban_movie_top250.csv', 'a', newline='', encoding='utf-8-sig')
global writer
writer = csv.writer(f)
writer.writerow(['电影名称', '评分', '评价人数'])
for i in range(10):
url = 'https://movie.douban.com/top250?start=' + str(i*25) + '&filter='
response = requests.get(url, headers=headers)
parse_html(response.text)
f.close()
if __name__ == '__main__':
save_data()
本案例使用正则表达式和 requests 库爬取猫眼电影 Top100 的电影名称、主演和上映时间等信息,并将这些信息保存到 TXT 文件中。
import requests
import re
# 请求 URL
url = 'https://maoyan.com/board/4'
# 请求头部
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.36'
}
# 解析页面函数
def parse_html(html):
pattern = re.compile('<p class="name"><a href=".*?" title="(.*?)" data-act="boarditem-click" data-val="{movieId:\\d+}">(.*?)</a></p>.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'电影名称': item[1],
'主演': item[2].strip(),
'上映时间': item[3]
}
# 保存数据函数
def save_data():
f = open('maoyan_top100.txt', 'w', encoding='utf-8')
for i in range(10):
url = 'https://maoyan.com/board/4?offset=' + str(i*10)
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
f.write(str(item) + '\n')
f.close()
if __name__ == '__main__':
save_data()
本案例使用正则表达式和 requests 库爬取全国高校名单,并将这些信息保存到 TXT 文件中。
import requests
import re
# 请求 URL
url = 'http://www.zuihaodaxue.com/zuihaodaxuepaiming2019.html'
# 请求头部
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.36'
}
# 解析页面函数
def parse_html(html):
pattern = re.compile('<tr class="alt">.*?<td>(.*?)</td>.*?<td><div align="left">.*?<a href="(.*?)" target="_blank">(.*?)</a></div></td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>.*?</tr>', re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'排名': item[0],
'学校名称': item[2],
'省市': item[3],
'总分': item[4]
}
# 保存数据函数
def save_data():
f = open('university_top100.txt', 'w', encoding='utf-8')
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
f.write(str(item) + '\n')
f.close()
if __name__ == '__main__':
save_data()
本案例使用 xpath 和 requests 库爬取中国天气网的城市天气,并将这些信息保存到 CSV 文件中。
import requests
from lxml import etree
import csv
# 请求 URL
url = 'http://www.weather.com.cn/weather1d/101010100.shtml'
# 请求头部
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.36'
}
# 解析页面函数
def parse_html(html):
selector = etree.HTML(html)
city = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/h1/text()')[0]
temperature = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/p/i/text()')[0]
weather = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/p/@title')[0]
wind = selector.xpath('//*[@id="around"]/div/div[1]/div[1]/p/span/text()')[0]
return city, temperature, weather, wind
# 保存数据函数
def save_data():
f = open('beijing_weather.csv', 'w', newline='', encoding='utf-8-sig')
writer = csv.writer(f)
writer.writerow(['城市', '温度', '天气', '风力'])
for i in range(10):
response = requests.get(url, headers=headers)
city, temperature, weather, wind = parse_html(response.text)
writer.writerow([city, temperature, weather, wind])
f.close()
if __name__ == '__main__':
save_data()
本案例使用 xpath 和 requests 库爬取当当网图书信息,并将这些信息保存到 CSV 文件中。
import requests
from lxml import etree
import csv
# 请求 URL
url = 'http://search.dangdang.com/?key=Python&act=input'
# 请求头部
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.36'
}
# 解析页面函数
def parse_html(html):
selector = etree.HTML(html)
book_list = selector.xpath('//*[@id="search_nature_rg"]/ul/li')
for book in book_list:
title = book.xpath('a/@title')[0]
link = book.xpath('a/@href')[0]
price = book.xpath('p[@class="price"]/span[@class="search_now_price"]/text()')[0]
author = book.xpath('p[@class="search_book_author"]/span[1]/a/@title')[0]
publish_date = book.xpath('p[@class="search_book_author"]/span[2]/text()')[0]
publisher = book.xpath('p[@class="search_book_author"]/span[3]/a/@title')[0]
yield {
'书名': title,
'链接': link,
'价格': price,
'作者': author,
'出版日期': publish_date,
'出版社': publisher
}
# 保存数据函数
def save_data():
f = open('dangdang_books.csv', 'w', newline='', encoding='utf-8-sig')
writer = csv.writer(f)
writer.writerow(['书名', '链接', '价格', '作者', '出版日期', '出版社'])
response = requests.get(url, headers=headers)
for item in parse_html(response.text):
writer.writerow(item.values())
f.close()
if __name__ == '__main__':
save_data()
本案例使用 xpath 和 requests 库爬取糗事百科的段子,并将这些信息保存到 TXT 文件中。
import requests
from lxml import etree
# 请求 URL
url = 'https://www.qiushibaike.com/text/'
# 请求头部
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.36'
}
# 解析页面函数
def parse_html(html):
selector = etree.HTML(html)
content_list = selector.xpath('//div[@class="content"]/span/text()')
for content in content_list:
yield content
# 保存数据函数
def save_data():
f = open('qiushibaike_jokes.txt', 'w', encoding='utf-8')
for i in range(3):
url = 'https://www.qiushibaike.com/text/page/' + str(i+1) + '/'
response = requests.get(url, headers=headers)
for content in parse_html(response.text):
f.write(content + '\n')
f.close()
if __name__ == '__main__':
save_data()
本案例使用 selenium 和 requests 库爬取新浪微博,并将这些信息保存到 TXT 文件中。
import time
from selenium import webdriver
import requests
# 请求 URL
url = 'https://weibo.com/'
# 请求头部
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.36'
}
# 解析页面函数
def parse_html(html):
print(html)
# 保存数据函数
def save_data():
f = open('weibo.txt', 'w', encoding='utf-8')
browser = webdriver.Chrome()
browser.get(url)
time.sleep(10)
# 注意:生产环境请勿硬编码账号密码
browser.find_element_by_name('username').send_keys('username')
browser.find_element_by_name('password').send_keys('password')
browser.find_element_by_class_name('W_btn_a').click()
time.sleep(10)
response = requests.get(url, headers=headers, cookies=browser.get_cookies())
parse_html(response.text)
browser.close()
f.close()
if __name__ == '__main__':
save_data()
通过以上案例,读者可以掌握 Python 爬虫的核心流程。建议在实际项目中结合反爬机制(如验证码识别、IP 代理池)进一步提升稳定性。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online