爬取豆瓣TOP250 小练手项目
为防止疫情期间片荒无聊 好吧,就是找个理由学爬虫
一个练手的爬虫项目 爬取的网页 https://movie.douban.com/top250
大概分为三步1.伪造浏览器发请求信息(urllib) 2.对返回的信息进行正则表达式提取(re) 3.用excel造表
主要难点在于对返回信息的提取
例子如下
源码:
from bs4 import BeautifulSoup #它的作用是能够快速方便简单的提取网页中指定的内容,返回一个网页的 #字符串,
# 然后使用它的接口将网页字符串生成一个对象,然后通过这个对象的方法 #来提取数据
import re #正则表达式
import urllib.request,urllib.error #伪造请求欺骗浏览器 获取html文件
import xlwt #用excel造表的
import _sqlite3
#要用到的正则表达式
# 影片的连接
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>')
# 评价人数
findjudgenum = 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():
url = "https://movie.douban.com/top250?start="
datalist = getData(url)
saveData(datalist)
#爬取网页
def getData(baseurl):
datalist = []
for i in range(0,10):
url = baseurl + str(i*25)
html = askURL(url) #保存获取到的网页html
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)
title = re.findall(findTitle,item)
if len(title) == 2 :
ctitle = title[0]
data.append(ctitle)
otitle = title[1].replace('/','')
data.append(otitle)
else:
data.append(title[0])
data.append(" ")
rate = re.findall(findRating,item)
data.append(rate)
judgenum = re.findall(findjudgenum,item)
data.append(judgenum)
Inq = re.findall(findInq,item)
if len(Inq)!=0:
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)
datalist.append(data)
for item in datalist:
print(item)
return datalist
# 得到指定一个url的网页内容
def askURL(url):
head = { #模拟浏览器服务信息
"User-Agent": "Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 80.0.3987.149Safari / 537.36"
} #欺骗服务器我们是什么类型浏览器,可以接受什么水平的文件内容 也可以填自己的 用户代理这块要小心点复制
html = ""
request = urllib.request.Request(url,headers=head)
response = urllib.request.urlopen(request)
html = response.read().decode("utf-8")
# print(html)
return html
#用excel保存数据
def saveData(datalist):
print("saving")
book = xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet = book.add_sheet('doubanTop250',cell_overwrite_ok=True)
column = ('电影详情连接','图片链接','影片中文名','影片外国名','评分','评价数','概况','相关讯息')
for i in range(0,8):
sheet.write(0,i,column[i])
for i in range(0,250):
print("第%d条"%(i+1))
data = datalist[i]
for j in range(0,8):
sheet.write(i+1,j,data[j])
book.save('doubanTOP250.xls')
return
if __name__ == "__main__":
main()
最终成果部分展示