爬虫基础概念
网络爬虫(又被称为网页蜘蛛,网络机器人)模拟浏览器发送网络请求,接收请求响应,按照一定的规则自动抓取互联网信息的程序。原则上,只要是浏览器能做的事情,爬虫都能够做。
为什么使用爬虫?
互联网大数据时代,信息获取自由但存在海量无效垃圾信息。通过技术将相关内容收集起来,分析筛选才能得到真正需要的信息。该技术应用范畴广泛,包括生活服务、金融投资、制造业产品市场需求等。
准备工作
虽然多种语言可做爬虫,但 Python 相对简单且功能齐全。
- 环境配置:下载 Python 3.x 版本及运行环境(如 PyCharm)。
- 依赖库:需要安装支持爬虫运行的库,常见包括
BeautifulSoup、re、urllib、xlwt等。

项目实战:爬取豆瓣电影 Top250
目标网站:https://movie.douban.com/top250
爬取内容包括:电影详情链接、图片链接、影片中文名、外国名、评分、评价数、概况及相关信息。最终结果可保存为 xls 表格或数据库。

代码分析与实现
核心流程分为三步:爬取网页、解析数据、保存数据。
# -*- coding = utf-8 -*-
from bs4 import BeautifulSoup # 网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request, urllib.error # 制定 URL,获取网页数据
import xlwt # 进行 excel 操作
findLink = re.compile(r'<a href="(.*?)">') # 影片详情链接的规则
findImgSrc = re.compile(r'<img.*src="(.*?)"', re.S)
findTitle = re.compile(r'<span class="title">(.*)</span>')
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
findJudge = re.compile(r'<span>(\d*)人评价</span>')
findInq = re.compile(r'<span class="inq">(.*)</span>')
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
def main():
baseurl = "https://movie.douban.com/top250?start=" # 要爬取的网页链接
datalist = getData(baseurl)
savepath = "豆瓣电影 Top250.xls" # 当前目录新建 XLS,存储进去
saveData(datalist, savepath) # 2 种存储方式可以只选择一种
# 爬取网页
def getData(baseurl):
datalist = [] # 用来存储爬取的网页信息
for i in range(0, 10): # 调用获取页面信息的函数,10 次
url = baseurl + str(i * 25)
html = askURL(url) # 保存获取到的网页源码
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="item"): # 查找符合要求的字符串
data = [] # 保存一部电影所有信息
item = str(item)
link = re.findall(findLink, item)[0]
data.append(link)
imgSrc = re.findall(findImgSrc, item)[0]
data.append(imgSrc)
titles = re.findall(findTitle, item)
if (len(titles) == 2):
ctitle = titles[0]
data.append(ctitle)
otitle = titles[1].replace("/", "") # 消除转义字符
data.append(otitle)
else:
data.append(titles[0])
data.append(' ')
rating = re.findall(findRating, item)[0]
data.append(rating)
judgeNum = re.findall(findJudge, item)[0]
data.append(judgeNum)
inq = re.findall(findInq, item)
if len(inq) != 0:
inq = inq[0].replace("。", "")
data.append(inq)
else:
data.append(" ")
bd = re.findall(findBd, item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?', "", bd)
bd = re.sub('/', "", bd)
data.append(bd.strip())
datalist.append(data)
return datalist
# 得到指定一个 URL 的网页内容
def askURL(url):
head = { # 模拟浏览器头部信息,向豆瓣服务器发送消息
"User-Agent": "Mozilla / 5.0(Windows NT 10.0; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.122 Safari / 537.36"
}
request = urllib.request.Request(url, headers=head)
html = ""
try:
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
# 保存数据到表格
def saveData(datalist, savepath):
print("save.......")
book = xlwt.Workbook(encoding="utf-8", style_compression=0) #创建 workbook 对象
sheet = book.add_sheet('豆瓣电影 Top250', cell_overwrite_ok=True) #创建工作表
col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
for i in range(0,8):
sheet.write(0,i,col[i]) #列名
for i in range(0,250):
data = datalist[i]
for j in range(0,8):
sheet.write(i+1,j,data[j]) #数据
book.save(savepath) #保存
if __name__ == "__main__": # 当程序执行时
main()
print("爬取完毕!")
关键步骤解析
- 编码设置:文件开头设置
coding = utf-8,防止乱码。 - 正则表达式:使用
re库定义规则筛选信息,如链接、标题、评分等。 - 翻页逻辑:Top250 每页显示 25 条,需循环访问 10 次(
range(0, 10)),URL 参数start每次增加 25。 - 模拟浏览器:在
askURL函数中设置User-Agent头部信息,伪装成浏览器身份,避免被服务器识别为爬虫而拒绝服务(如返回 418 错误)。 - 数据存储:使用
xlwt库将数据写入 Excel 表格,也可选择 SQLite 数据库存储。



