文章目录
前言安装bs4库网站分析获取页面爬取页面页面分析其他页面爬虫系列前言
经过上篇博客Python爬虫小白教程(一)—— 静态网页抓取后我们已经知道如何抓取一个静态的页面了,现在就让我们爬取豆瓣评分TOP250的电影实战一下。
安装bs4库
除了Requests库之外,我们还需要BeautifulSoup库来解析爬取到的页面。在cmd中输入:
pip install bs4
或者在Anaconda Prompt中输入:
conda install bs4
网站分析
打开豆瓣电影TOP250 的网站,使用Chrome中的“检查”功能查看该网页的请求头,如下图所示。
按照教程一中的方法提取请求头:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36','Host':''}
发现第一页只有25个电影,点击下方第二页后URL变为/top250?start=25&filter=
,点击第三页后URL变为/top250?start=50&filter=
,由此我们可以发现URL的规律。又发现将URL后面的&filter=
删除后仍可以打开网页,故为了简便将URL改为/top250?start=25
。
获取页面
为了模块化我们在此将获取页面的代码封装到一个函数中,如下。
import requestsfrom bs4 import BeautifulSoupdef get_page(url,params=None,headers=None):response = requests.get(url, headers=headers, params=params)print(response.url)page = BeautifulSoup(response.text, 'lxml')print("响应状态码:", response.status_code)return page
BeautifulSoup(response.text, 'lxml')
中的lxml
参数是一种常用的解析页面的方法。
爬取页面
运行下面的代码,即可得到第一页的网页代码。
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36','Host':''}page = get_page('/top250', headers=headers)print(page)
输出如下
爬取成功后我们进行下一步的页面分析。
页面分析
Chrome中有一个很快捷的方法让我们找到想要获取的元素在网页代码中的位置。如下图所示,点击左上角的按钮,点击后用鼠标点击想要获取的元素。
然后系统将会为我们自动定位到该元素的代码。
分析此电影以及其他电影名字的位置,可见它们都在<div class="hb">
中,然后我们用page
的find_all
函数来找到代码中所有calss为hb的div,并将其保存到div_list
中。
div_list = page.find_all('div',class_='hd')print(div_list)
输出如下:
然后我们分析其中一个div。
print(div_list[0])
输出为:
<div class="hd"><a class="" href="/subject/1292052/"><span class="title">肖申克的救赎</span><span class="title"> / The Shawshank Redemption</span><span class="other"> / 月黑高飞(港) / 刺激1995(台)</span></a><span class="playable">[可播放]</span></div>
电影名字就在第一个span
中,因此仅需要
div_list[0].a.span
便可以将第一个span
中的内容输出来,输出为
<span class="title">肖申克的救赎</span>
使用.text
获取里面的文字,再使用strip()
去除空格,即
div_list[0].a.span.text.strip()
现在的输出是
'肖申克的救赎'
至此我们已经获得一个电影的名字,其余的使用循环即可,并将其保存到名为title_list
的列表中,代码如下:
title_list = []for div in div_list:title = div.a.span.text.strip()title_list.append(title)
至此我们已经获得第一个页面的所有电影名字。
其他页面
根据前面网站分析的步骤我们可以知道只要将传入Requests中get的参数params
改变一下即可获得其他页面的网页,下面用一个循环获取其他的页面。
for i in range(11):params = {"start":(i*25)}page = get_page('/top250',params=params,headers=headers)
综上,所有代码如下:
import timeimport requestsfrom bs4 import BeautifulSoup# 定义获取页面的函数def get_page(url,params=None,headers=None):response = requests.get(url, headers=headers, params=params)page = BeautifulSoup(response.text, 'lxml')print(response.url)print("响应状态码:", response.status_code)return pagetitle_list = [] # 电影名列表headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36','Host':''}for i in range(11):params = {"start":(i*25)}page = get_page('/top250',params=params,headers=headers)div_list = page.find_all('div',class_='hd')for div in div_list:title = div.a.span.text.strip()title_list.append(title)# 每次爬完后休眠1秒钟,防止爬取速度太快被封iptime.sleep(1)title_list
输出如下:
使用
print(len(title_list))
可知title_list
长度为250,可见我们已经成功获取到豆瓣评分TOP250 的所有电影名。
爬虫系列
Python爬虫小白教程(一)—— 静态网页抓取
Python爬虫小白教程(二)—— 爬取豆瓣评分TOP250电影
Python爬虫小白教程(三)——使用正则表达式分析网页
Python爬虫小白教程(四)—— 反反爬之IP代理池
Python爬虫小白教程(五)—— 多线程爬虫