300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【简单python爬虫】爬取豆瓣电影Top250的基本信息

【简单python爬虫】爬取豆瓣电影Top250的基本信息

时间:2018-12-24 04:44:47

相关推荐

【简单python爬虫】爬取豆瓣电影Top250的基本信息

本文属于学习笔记,所以很多具体的知识点并没有记录,如有需要可以留言。

1.爬虫初始

1.1什么是爬虫?

网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。

1.2爬虫可以做什么?

你可以爬取妹子的图片,爬取自己想看的视频等等,只要你能通过浏览器访问的数据都可以通过爬虫获取。

1.3爬虫的本质是什么?

模拟浏览器打开网页,获取网页中我们想要的那部分数据。

2.需求分析

爬取豆瓣电影Top250的基本信息,包括电影的名称、豆瓣评分、评价数、电影概况、电影链接。

3.基本流程

3.1获取数据,通过HTTP库向目标站点发起请求,请求可以包含额外的header等信息,如果服务器能正常响应,会得到一个Response,便是所要获取的页面内容。

3.2解析内容,得到内容可能是HTML,json等格式,可以用页面解析库、正则表达式等进行解析。

3.3保存数据,保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件。

〇补充:

①获取页面数据,补充urllib模块

用法讲解

简单的一个get请求

import urllib.request reponse = urllib.request.urlopen('') print(reponse.read().decode('utf-8'))

简单的一个post请求

import urllib.parse import urllib.request data = bytes(urllib.parse.urlencode({'hello':'world'}),encoding='utf-8') reponse = urllib.request.urlopen('/post',data=data) print(reponse.read())

由于使用urlopen无法传入很多我们需要参数,我们需要解决这个问题 我们需要声明一个request对象,通过这个对象来添加参数

import urllib.request request = urllib.request.Request('')#由于urlopen无法传参数,声明一个Request对象response = urllib.request.urlopen(request) print(response.read().decode('utf-8'))

②解析内容,补充BeautifulSoup模块

用法讲解

find_all(name, attrs, recursive, text, **kwargs)

1.name参数: 字符串过滤:会查找与字符串完全匹配的内容

a_list = bs.find_all("a") print(a_list)

正则表达式过滤:如果传入的是正则表达式,那么BeautifulSoup4会通过search()来匹配内容

from bs4 import BeautifulSoup import re file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html,"html.parser") t_list = bs.find_all(pile("a")) for item in t_list: Print(item)

补充:re模块

正则表达式(规则表达式):事先定义好规则然后去过滤字符串

re模块下的函数

compile(pattern):创建模式对象 fifindall(pattern,string):列表形式返回匹配项 import re print(re.findall( "a" , "ASDaDFGAa" )) #[ a , a ] #列表形式返回匹配到的字符串 pat = pile( "a" ) print(pat.findall( "ASDaDFGAa" )) #[ a , a ] #列表形式返回匹配到的字符串

4.保存数据

Excel表存储

〇补充xlwt模块

简单使用xlwt

import xlwt #导入模块 workbook = xlwt.Workbook(encoding='utf-8') #创建workbook 对象 worksheet = workbook.add_sheet('sheet1') #创建工作表sheet worksheet.write(0, 0, 'hello') #往表中写内容,第一各参数 行,第二个参数列,第三个参数内容 workbook.save('students.xls') #保存表为students.xls

数据库保存

待。。。

5.完整代码

from bs4 import BeautifulSoup # 网页解析,获取数据import re # 正则表达式,进行文字匹配import urllib.request, urllib.error # 制定URL,获取网页数据import xlwt # 进行excel操作def main():baseurl = "/top250?start="# 1.爬取网页datalist = getData(baseurl)savepath = "豆瓣电影Top250.xls"# 3.保存数据saveData(datalist,savepath)# 影片详情链接的规则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): # 调用获取页面信息的函数,10次url = baseurl + str(i * 25)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) # 把处理好的一部电影信息放入datalistreturn 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")# print(html)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):print("第%d条" % (i + 1))data = datalist[i]for j in range(0, 8):sheet.write(i + 1, j, data[j]) # 数据book.save(savepath) # 保存if __name__ == "__main__": # 当程序执行时# 调用函数main()print("爬取完毕!")

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