700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python爬虫入门(爬取豆瓣电影信息小结)

Python爬虫入门(爬取豆瓣电影信息小结)

时间:2018-10-14 08:23:00

相关推荐

Python爬虫入门(爬取豆瓣电影信息小结)

Python爬虫入门(爬取豆瓣电影信息小结)

1、爬虫概念

网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或脚本。爬虫的本质是模拟浏览器打开网页,获取网页中我们想要的那部分数据。

2、基本流程(本次主要针对html文件)

具体描述可参考:爬虫基本原理(引用)

3、网页结构了解(重要)

由于爬虫的本质是模拟浏览器打开网页,所以我们需要了解HTTP 的操作过程。

HTTP即超文本传输协议。HTTP协议是用于从网络传输超文本数据到本地浏览器的传送协议,它能保证高效而准确地传送超文本文档。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,简称为HTTPS。

当准备爬取某网页时需通过按f12进入开发者模式,观察网页源代码(Elements中)以及浏览器和服务器端互相通信的信息(Network中)。如以下图片所示:

user-agent反映用户浏览器版本和操作系统,cookie存储用户加密信息,如果想爬取用户登录后的网页信息需要用到cookie。总之,需要注意Response Headers和Request Headers即响应头和请求头内的信息。还需注意请求方法get与post的区别与应用场景。

其中具体信息可参考Http基本原理(引用)

4、具体代码

from bs4 import BeautifulSoup #网页解析,获取数据import re #正则表达式,进行文字匹配import urllib.request,urllib.error #制定URL,获取网页数据import xlwt #进行excel操作import sqlite3 #进行SQLite数据库操作def main():baseurl="/top250?start="#1、爬取网页datalist=getData(baseurl)#savepath=".\\豆瓣电影Top250.xls"dbpath="movie.db"#3、保存数据#saveData(datalist,savepath)saveData2DB(datalist,dbpath)#影片详情的链接的规则findLink=pile(r'<a href="(.*?)">') #创建正则表达式对象,表示规则(字符串的模式)#影片图片的链接的规则findImgSrc=pile(r'<img.*src="(.*?)"',re.S)#re.S让换行符包含在字符中#影片片名findTitle=pile(r'<span class="title">(.*)</span>')#影片评分findRating=pile(r'<span class="rating_num" property="v:average">(.*)</span>')#找到评价人数findJudge=pile(r'<span>(\d*)人评价</span>')#找到概况findInq=pile(r'<span class="inq">(.*)</span>')#找到影片的相关内容findBd=pile(r'<p class="">(.*?)</p>',re.S)#爬取网页def getData(baseurl):datalist=[]for i in range(0,10):url=baseurl+str(i*25) #调用获取页面信息的函数,10次html=askURL(url) #保存获取到的网页源码# 2、逐一解析数据soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"): #查找符合要求的字符串,形成列表#print(item) #测试:查看电影item所有信息data=[]#保存一部电影的所有信息item=str(item)#影片详情的链接link=re.findall(findLink,item)[0] #re库用来通过正则表达式查找指定的字符串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) #去掉<br/>bd=re.sub('/'," ",bd)#替换/data.append(bd.strip())#去掉前后的空格datalist.append(data) #把处理好的一部电影信息放入datalst# print(datalist)return datalist#得到指定一个URL的网页内容def askURL(url):head={#模拟浏览器头部信息,向豆瓣服务器发送消息"User-Agent": "Mozilla / 5.0(Windows NT 10.0;WOW64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 56.0.2924.90Safari / 537.36 2345Explorer / 9.3.0.17248"}#用户代理,表示告诉服务器我们是什么类型的机器、浏览器(本质上是告诉浏览器我们可以接收什么水平的文件内容)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"):#判断e这个对象里面是否包含code这个属性print(e.code)if hasattr(e,"reason"):print(e.reason)return html#3、保存数据def saveData(datalist,savepath):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):print("第%d条"%(i+1))data=datalist[i]for j in range(0,8):sheet.write(i+1,j,data[j])#数据book.save(savepath) # 保存数据表def saveData2DB(datalist,dbpath):init_db(dbpath)conn=sqlite3.connect(dbpath)cur=conn.cursor()for data in datalist:for index in range(len(data)):if index==4 or index==5:continuedata[index]='"'+data[index]+'"'sql='''insert into movie250(info_link,pic_link,cname,ename,score,rated,introduction,info)values (%s)'''%",".join(data)#print(sql)cur.execute(sql)mit()cur.close()conn.close()def init_db(dbpath):sql='''create table movie250(id integer primary key autoincrement,info_link text,pic_link text,cname varchar,ename varchar,score numeric,rated numeric,introduction text,info text)'''#创建数据表conn=sqlite3.connect(dbpath)cursor=conn.cursor()cursor.execute(sql)mit()conn.cursor()if __name__=="__main__": #当程序执行时main() #调用函数print("爬取完毕")

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。