从零开始写爬虫,豆瓣影片的爬取
一、 准备工作
语言:python
编辑器:pycharm
需要导的包:bs4、re、urllib、xlwt(可以通过左上角file->settings->project->interpreter->右边加号导包)
爬虫就是编写程序模拟浏览器打开网页获取需要的内容
二、 构建流程
from bs4 import BeautifulSoup #网站解析,获取数据
import re #正则表达式
import urllib.request,urllib.error #指定url
import xlwt #excel操作
import sqlite3 #数据库操作
def main():
baseurl = "https://movie.douban.com/top250?start="
#获取数据
datalist = getData(baseurl)
#保存文件
savepath = ".\\豆瓣.xls"
saveData(datalist, savepath)
#askUrl(baseurl)
pass
#获取爬取的网页数据
def getData(baseurl):
datalist = []
return datalist
#得到指定一个url的网页内容,后面会将urllib的使用
def askUrl(url):
#用户代理 表明是什么类型的浏览器
head = {
"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36"
}
req = urllib.request.Request(url=url,headers=head)
html = ''
try:
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
return html
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
pass
if hasattr(e,"reason"):
print(e.reason)
pass
pass
#保存数据
def saveData(datalist, savepath):
pass
main()
三、各种工具的使用
1、urllib的使用
urllib 是一个收集了多个涉及 URL 的模块的包:
urllib.request 打开和读取 URL
urllib.error 包含 urllib.request 抛出的异常
urllib.parse 用于解析 URL
urllib.robotparser 用于解析 robots.txt 文件
所以我们可以新建一个testUrllib.py文件,单独测试下urllib的使用
import urllib.request,urllib.error,urllib.parse
#首先定义一个url
url = "http://www.douban.com"
#设置header的user-agent原因是如果不设置,会显示user-agent:python-urllib,从而有时候爬取失败,所以要伪装成是用浏览器打开
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
}
#post 将传递的data数据包装起来
data = bytes(urllib.parse.urlencode({
"hello":"world"}),encoding='utf-8')
#发出request请求
req = urllib.request.Request(url=url,headers=headers,method='POST',data=data)
res = urllib.request.urlopen(req)
#获取数据 可以看到获取的是豆瓣网的代码,后面我们将对这些内容进行解析获取需要的内容
print(res.read().decode('utf=8'))
2、bs4 BeautifulSoup的使用
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.
下面有几个常用方法,更多详细的使用可以去看官方文档
from bs4 import BeautifulSoup
import re
file = open("./baidu.html","rb")
html = file.read()
bs = BeautifulSoup(html,"html.parser")
# print(bs.title.string)
# t_list = bs.find_all("a")
# print(t_list)
# 正则表达式搜索
# t_list = bs.find_all((re.compile("a")))
#方法搜索
# def name_is(tag):
# return tag.has_attr("name")
# t_list = bs.find_all(name_is)
# for i in t_list:
# # print(i)
# print(t_list)
#关键字查找
# t_list = bs.find_all(id="head")
# for i in t_list:
# print(i)
#text参数
# t_list = bs.find_all(text="hao123")
# for i in t_list:
# print(i)
# pass
#
# t_list = bs.find_all(text=re.compile("\d"))
# for i in t_list:
# print(i)
#llimit参数
t_list = bs.find_all("a",limit=3)
for i in t_list:
print(i)
3、xlwt的使用
xlwt 是 Python 用来在 Excel 写入数据和格式化数据的工具包
下面以九九乘法表为例
import xlwt
workbook = xlwt.Workbook(encoding='utf-8') #创建对象
worksheet = workbook.add_sheet('sheet1') #创建表单 sheet1对应下图标注处
for i in range(0,9):
for j in range(0,i+1):
#将内容写进表单中
worksheet.write(i,j,"%d * %d = %d"%(i+1,j+1,(i+1)*(j+1)))
pass
pass
#将写好的存放到excel中
workbook.save('student.xls') #这里的student.xls是文件名
四、正式开始
from bs4 import BeautifulSoup #网站解析,获取数据
import re #正则表达式
import urllib.request,urllib.error #指定url
import xlwt #excel操作
def main():
baseurl = "https://movie.douban.com/top250?start="
#获取数据
datalist = getData(baseurl)
#保存文件
savepath = ".\\豆瓣.xls"
saveData(datalist, savepath)
pass
#这里使用正则表达式,导入的re包,解析获取的网页内容
#找到链接
findLink = re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则
#找到海报
findImgSrc = re.compile(r'<img .* src="(.*?)"',re.S)
#找到标题
findTitle = re.compile(r'<span class="title">(.*)</span>')
#找到评分
findRate = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#找到评价人数
findPerson = re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
#找到影片相关内容
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)
#爬取网页
def getData(baseurl):
datalist = []
for i in range(0, 10): #获取10次 这里是因为爬取的是top250 所以知道有250个
url = baseurl + str(i*25)
html = askUrl(url) #保存爬取的网页
#2.逐一解析数据
soup = BeautifulSoup(html, "html.parser")
for item in soup.find_all('div', class_="item"):#查找符合要求的字符串 这里的class后要加个下划线
data = [] #保存一部电影的信息
item = str(item)
# print(item)
#获取到影片详情的链接
link = re.findall(findLink, item)[0] #正则表达式查找指定的字符串
data.append(link) #添加链接
imgSrc = re.findall(findImgSrc, item)[0] # 正则表达式查找指定的字符串
data.append(imgSrc)#添加海报
title = re.findall(findTitle, item)
if(len(title) == 2):#添加片名
ctitle = title[0]
data.append(ctitle) #添加中文名
otitle = title[1].replace("/", "")
data.append(otitle)#添加外文名
pass
else:
data.append(title[0])
data.append(' ')#留空 为了excel处可以对齐
pass
per = re.findall(findPerson, item)[0]
data.append(per)#添加评价人数
rating = re.findall(findRate, item)[0]
data.append(rating)#添加评分
inq = re.findall(findInq, item) #添加概述
if len(inq):
inq = inq[0].replace("。", "")
data.append(inq)
pass
else:
data.append(" ")
pass
bd = re.findall(findBd, item)[0]
bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)
bd = re.sub('/', " ", bd)
data.append(bd.strip()) #添加
datalist.append(data)
pass
pass
print(datalist)
return datalist
#得到指定一个url的网页内容
def askUrl(url):
#用户代理 表明是什么类型的浏览器
head = {
"User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36"
}
req = urllib.request.Request(url=url,headers=head)
html = ''
try:
res = urllib.request.urlopen(req)
html = res.read().decode('utf-8')
return html
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
pass
if hasattr(e,"reason"):
print(e.reason)
pass
pass
#保存数据
def saveData(datalist, savepath):
workbook = xlwt.Workbook(encoding='utf-8', style_compression=0) # 创建对象
worksheet = workbook.add_sheet('豆瓣电影250', cell_overwrite_ok=True) # 创建表单
col = ('电影详情链接', "图片链接", "影片中文名", "影片外文名", "评分", "评分数", "概况", "相关信息")
#设置表头
for i in range(0, 8):
worksheet.write(0, i, col[i])
pass
#将解析后的内容写入excel表中
for i in range(0, 250):
print("第{}条".format(i))
data = datalist[i]
for j in range(0, 8):
worksheet.write(i+1, j, data[j])
pass
pass
workbook.save(savepath)
pass
#运行
main()
结果图如下:
初识爬虫,还存在各种问题,希望大家可以批评指正
我感觉就是解析网页时候可能会有点问题吧