豆瓣top250电影的所有信息,利用爬虫爬取成功!

243 阅读4分钟

python 爬虫

按照一定规则,自动抓取互联网信息的脚本

本质:

模拟浏览器打开的过程

爬取豆瓣top250

第一次用python爬虫实现一个爬取网页信息的功能,简单地对这个项目做一个大概的总结

Step 1. 找到URL

爬取一系列网址的关键操作就是找到这一系列网址的URL规律

movie.douban.com/top250?star…

xxx代表从排名第XXX开始,例如 start=25,页面第一个就是top26

每一页有25部电影,因此,为了爬取所有网页信息,需要做一个循环读取网页。

Step 2. 建立链接

利用python库的urllib的request 方法模拟访问浏览器过程

req=urllib.request.Request(url=url,headers=header)

创建request对象,这里必须要注意的点是,豆瓣有反爬虫机制,因此,需要将爬虫伪装

修改的方法是自定义request报文头:

修改报文头的方法

  • f12进入浏览器的开发者模式,找到network,刷新页面并点击红色方框,获取到request header
  • 一般来说,只需要将header的User-agent伪装成浏览器即可,有些网页还需要伪装cookie
  • 创建字典,键值对就是User-agent和其在浏览器找到的信息

之后,创建response对象建立链接

response=urllib.request.urlopen(req)

Step 3.获取数据

豆瓣top250的网页数据繁多,必须要提取有用的信息

获取数据,先要进入开发者模式找到其数据存放的块

image-20200909214611605

我们要找的数据存放在div class="item"的块内,因此,我们需要利用python 的 beautifulsoup

bs解析html

bs提供许多解析方法,其中就包括解析html

在建立链接时,askUrl会返回一个html,也就是每个页面的源代码,我们接下来需要解析源代码

bs.find_all("div",class_='item')
#bs的方法,其含义是找到div模块,并且其class的名字为item,返回其中的每个item内的所有内容,每一个都是列表的一个元素,即返回列表(每一部电影的所有信息)

可是,每个item里的所有内容,还有html ,css 等代码,并不是我们需要的,而且并没有被分类,我们需要用到正则表达式来帮助我们完成搜索分类

正则表达式

一套对字符串评判的方法

例如电影名:

image-20200909215449545

不难发现,其特有特征就是<span class="title"> 和</span>中间的内容

利用正则表达式:

find_title=re.compile(r'<span class="title">(.*)</span>')
#(.*)就是我们要寻找的字符串内容,这里需要小心,有一些电影有外文名,因此,必须使用贪婪模式,不能使用懒惰模式
name=re.findall(find_title,each)
#each是每一个item的所有内容,findall会返回一个列表,存放每一项内容

当匹配到多个时,即有的电影还有外文名时,需要单独分类匹配

正则表达式的贪婪匹配的和懒惰匹配的区别

(.*?)和(.*+)的区别

举一个小栗子:

<img src="小泽玛利亚.jpg" width="60px" height="50px"/>
re.compile=(r'src="(.*)"')
<-!>这里会得到的列表有就是:小泽玛利亚.jpg" width="60px" height="50px
因为默认为贪婪匹配,就是匹配到最后一个引号"为止的里面所有内容</-!>

re.compile=(r'src="(.*?)"')
<-!>这里会得到小泽玛利亚.jpg,因为只匹配到第一个"就停止</-!>

Step 4. 数据存放

数据分类完成,需要存放到一个列表中

创建一个名为data的列表,记录每一个item中所有的有用内容(即每一部电影的所有的有用内容),列表有八个元素,分别为 ”电影名“....等

之后用dataList的列表,存放每一部电影对应的data列表,dataList元素个数为250个

Step 5. 数据可视化

python提供的xlwt可以帮助我们归类到excel文件,达到数据可视化的目的

创建一个workbook:

workbook=xlwt.Workbook(encoding="utf-8")
#注意编码方式为utf-8
worksheet=workbook.add_sheet("sheet_1",cell_overwrite_ok=True)
#cell_overwrite_ok为True,允许覆盖原内容
worksheet.write(0,0,"index")
#write方法,第一个0代表行,第二个0代表列,第三个代表写入的值

到此为止,已经将所有top250的电影信息爬取并且可视化保存,效果如图:

image-20200910112207549