一、工具以及相关的包
1.使用Pytho3.6,anaconda中的jupyter notebook工具。
2.Python中的用于网页解析的BeautifulSoup4 包。
二、数据来源
此次数据来源是豆瓣电影的官方数据。最近想去看几部豆瓣评分比较高的数据,发现每次都要进入豆瓣电影官网进行查看哪些电影的评分高,且电影是什么题材的,主演是谁,主要讲了哪些什么故事等,着实是非常费时又麻烦的事情,所以想把主要的信息从官网中抓取下来统一保存在本地,方便下次直接查阅。
三、数据抓取
1.查看网页,分析源码
打开豆瓣T250网页,如 下图所示,当前的网址是:https://movie.douban.com/top250?start=0&filter=
点击查看网页源代码,幸运的是,会发现我们需要查找的数据都在此网页中,所以本次数据爬取的关键点就是对网页源码的解析。
�2. 分析URL地址
在数据爬取过程中,当页面涉及多页的时候,我们需要分析其URL地址有如何变化特点,方便我们后续写相关的正则表达式,以来匹配所有的页面,从而实现对所有网页数据的抓取。
首先抓取豆瓣T250首页会发现其地址为:https://movie.douban.com/top250?start=0&filter=
当点击到第二页的时候,其地址为https://movie.douban.com/top250?start=25&filter=
�通过观察发现,豆瓣T250,每一页包含25部电影,且在网址中只有start=””这个参数的值在变化,且第一页为0,第二页为25,第三页为50...,所以可以将此网址格式化成:
Url=“https://movie.douban.com/top250?start={}&filter= ”,且start的获得如下所示:
for i in range(10):
start=i*25
top_url=url.format(start)
通过这种方式便可以得到所有的网页URL地址。
3. 编写Python爬虫代码
此次爬虫并不是基于网站的API进行的爬虫,而是通过HTML网址进行的爬虫,此过程用到了Python中专门用来解析HTML语言的BeautifulSoup的包。像BeautifulSoup包中的soup就是BeautifulSoup处理格式化后的字符串,例如soup.p 得到的是文档中的第一个p标签,要想得到所有标签,需要使用find_all 函数。get_text() 是返回文本,这个对每一个BeautifulSoup处理后的对象得到的标签都是生效的。
本次实验爬取了豆瓣T250上面的所有电影,以及电影的名称,主演,评分,标语以及主演,电影题材和电影的链接。部分结果如下图所示:
爬虫代码实现如下:
四、问题解析
1.编码问题
在本次实验中,编译过程中出现了类似'gbk' codec can't encode character '\ubc14' in position 555: illegal multibyte sequence这样的Bug,查找发现,可能的原因是网页的数据应该是'utf-8'编码,而爬取网页的时候把它转化成了Unicode。解决方法是,在文件写入时,将其设置为encoding='utf-8'类型,即
with open("D:\\python\\notebook\\top250_movie.txt","w",encoding='utf-8')
或者直接在转化后的Unicode编码的string后面,加上 .encode('GBK','ignore').decode('GBk') 也就是先用gbk编码,忽略掉非法字符,然后再译码。
2.文本输出问题
在抓取的文件中含有HTML标签,这个原因可以直接通过get_text()函数,来返回文本,这个对每一个BeautifulSoup处理后的对象得到的标签都是生效的。