最近需要写一些爬虫来爬一爬公司的网站,就用python的爬虫教程网站“豆瓣电影 Top 250”试试手。(可怜的网站,无数人用它 来尝试hello world级别的爬虫)。
爬虫是一个从网页获取收据,分析呈现数据的过程。我们可以轻易获取网页上呈现的所有数据,这些数据类似于雕塑用的原石,而我们的重点在于如何把原石雕刻成雕塑。
整个过程需要三个步骤:
1.查看目的网页的网页源代码,分析那些数据是我们需要的
2.获取所有的数据,并过滤目标数据
3.组织并且呈现目标数据
首先我们打开https://movie.douban.com/top250 首页,发现所有的数据散布在10个不同的页面里,我们需要处理单个的页面,还要获取当前页面的下一页的链接,这说明我们的代码里或许要用到递归或者循环。
接着分析每一个页面,
每一个电影都在ol 下,一个电影的所有信息都在标签 li 下面,我们计划只要电影名和评分,电影名在hd的title里,而电影评分在bd的star里。
获取其中一页电影名和评分代码
from urllib.request import urlopen from urllib.error import HTTPError from bs4 import BeautifulSoup URL250 = "https://movie.douban.com/top250" def GetOnePage(url=URL250): html = urlopen(url) bsObj = BeautifulSoup(html.read(), features="html.parser") movielistol = bsObj.find('ol', {'class':'grid_view'}) movie_dict ={} for movies in movielistol('li'): # get movie name in hd info = movies.find('div', attrs={'class':'info'}) hd = info.find('div', attrs={'class':'hd'}) movie_name = hd.find('span', attrs={'class':'title'}).getText() # get movie score in bd bd = info.find('div', attrs={'class':'bd'}) star = bd.find('div', attrs={'class':'star'}) rating_num = star.find('span', attrs={'class':'rating_num'}).getText() movie_dict[movie_name] = rating_num next_page = bsObj.find('span', attrs={'class':'next'}).find('a') if next_page: html = URL250+next_page['href'] else: html = None return html, movie_dict真正的beautiful soup 操作是从bsObj = BeautifulSoup(html.read(), features="html.parser") 开始,先获取ol,之后在遍历ol 获取每一个li,在li里获取info,info里面的hd有电影名,info里面的bd有电影的打分(星星)信息,把所有的电影名和打分信息存储成一个字典,之后通过获取下一页的链接。
获取下一页的链接可以同时观察网页源码和在网页上点击下一页展示的地址,相互印证。
首页地址: https://movie.douban.com/top250
第二页地址:https://movie.douban.com/top250?start=25&filter=
最后一页地址:https://movie.douban.com/top250?start=225&filter=
观察首页网页源码:
<span class="next"> <link rel="next" href="?start=25&filter="/> <a href="?start=25&filter=" >后页></a> </span>可知我们可以从这里获取下一页地址的片段,和首页的拼接在一起即可。注意,最后一页的下一页就是空了。
<span class="next"> 后页> </span>函数返回一个dict存储当前页面所有电影的信息和下一页的链接。
接下来看如何调用,在同一个文件里
def GetAllData(): html = URL250 movie_dict ={} while html != None: html, tempmovielist = GetOnePage(html) movie_dict.update(tempmovielist) return movie_dict All250Data = GetAllData() print(All250Data)