python 爬虫
按照一定规则,自动抓取互联网信息的脚本
本质:
模拟浏览器打开的过程
爬取豆瓣top250
第一次用python爬虫实现一个爬取网页信息的功能,简单地对这个项目做一个大概的总结
Step 1. 找到URL
爬取一系列网址的关键操作就是找到这一系列网址的URL规律
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的网页数据繁多,必须要提取有用的信息
获取数据,先要进入开发者模式找到其数据存放的块
我们要找的数据存放在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 等代码,并不是我们需要的,而且并没有被分类,我们需要用到正则表达式来帮助我们完成搜索分类
正则表达式
一套对字符串评判的方法
例如电影名:
不难发现,其特有特征就是<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的电影信息爬取并且可视化保存,效果如图: