目录
1.算法原理:
(1)利用import命令导入模块或者导入模块中的对象;
①利用requests库获取数据;
②用BeautifulSoup库将网页源代码转换成BeautifulSoup类型,以便于数据的解析和处理;
③用time库进行时间延时,避免访问速度过快被封禁(封禁后会一段时间内无法进行对网址的访问);
(2)利用resquests.get()获取的数据,其中第一个参数为网页链接,第二个参数为请求头Headers,返回的数据类型为字符串类型网页源代码;
(3)利用BeautifuSoup()命令将获取的网页源代码转化为BeautifuSoup对象,第一个参数为要解析的HTML文本,即网页源代码,第二个参数为解析HTML的解析器;
(4)利用CSS选择器,找到我们所需要的数据,在CSS选择器中,“#”表示id,“.”表示class;
(5)tag(标签)对象的常用属性/方法
属性/方法 | 作用 |
tag.find() | 返回符合条件的首个数据 |
tag.find_all() | 返回符合条件的所有数据 |
tag.text | 获取标签的文本内容 |
tag['属性名'] | 获取标签HTML属性的值 |
例如:
(6)字符串的format格式:<模板字符串>.format(<以逗号分隔的参数>),format()中参数和前面的{}顺序一 一对应例如:
print('我是{},来自{}。'.format('小浪','中国'))
也可以在{}中加入序号,format()括号中类似列表进行读取,序号对应列表的下标,例如:
print('我是{1},来自{0}。'.format('中国','小浪'))
也可以给占位符{}命名,例如:
print('我是{name},来自{country}。'.format(country='中国',name='小浪'))
以上三种都输出:我是小浪,来自中国。
2.程序流程:
(1)利用import导入第三方库requests,time和bs4库中的BeautifulSoup;
(2)创建get_film函数,形参为变量link(用于传入网址,因为每页只有25部电影,爬取250部,每个网页链接末尾的查询字符串会有所不同)
(3)为了应对反爬虫机制,这里修改请求头,将网页中User-Agent字段定义为字典,传入requests.get()命令中,赋值给变量res(当然,也有其他的方法,比如通过别的IP访问网站,具体请自己查看requests的官方文档:https://cn.python-requests.org/zh_CN/latest/);
①: 打开豆瓣电影top250排行版,右击(以搜狗浏览器为例)--->审查元素,点击方块内图标
②:随便点击一个电影名,以《肖申克的救赎》为例,网页加载完毕点击Network标签,里面可能为空的,刷新一下网页就好了。点击Network——>name中第一个标签——>找到Requests Headers标签——>找到User-Agent字段。
(4)将res.text(源代码的字符串格式)传给BeautifulSoup命令,并且用Python内置的解析器html.parser,赋值给变量soup;
(5)利用CSS选择器找到标签为div,class="hd"的所有元素(随便点击一部电影名称,以《肖申克的救赎》为例,观察到的规律为电影链接、电影名分布在标签为:div,class="hd"的标签“a”中),传入soup.select()命令中,赋值给item;
(6)遍历item中的所有元素,观察发现链接在标签a中的href属性中,电影名在标签a中第一个标签span的文本中,此时用find命令可以找到第一个符合条件的元素,找到第一个标签其中的文本内容,并输出电影名和电影链接;
(7)观察豆瓣10页的网页链接(每页25个电影,其实就观察几页就可以发现规律):
https://movie.douban.com/top250?start=0&filter=(第一页,从一开始网页打开没有问号后的查询字符串,从其他页跳到第一页就有了,第一页带查询字符串和不带查询字符串打开内容相同)
https://movie.douban.com/top250?start=25&filter=(第二页)
https://movie.douban.com/top250?start=50&filter=(第三页)
通过以上三个网页链接的对比发现,只有start后面的发生了改变,那么就可以利用字符串的format格式,进行创建字符串列表link_all
(8)遍历10页网页,传入之前建立的函数get_film,利用time.sleep()进行延时爬取,防止访问速度过快被对方服务器封禁。
3.程序代码:
import requests
import time
from bs4 import BeautifulSoup
def get_film(link):
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X MetaSr 1.0'}
res=requests.get(link,headers=headers)
soup=BeautifulSoup(res.text,'html.parser')
items=soup.select('div.hd a')
for i in items:
name=i.find('span').text
link_film=i['href']
print('电影名:',name,'网址:',link_film)
l='https://movie.douban.com/top250?start={}&filter='
link_all=[l.format(i*25) for i in range(10)]
for i in range(10):
get_film(link_all[i])
time.sleep(1)
4.运行结果(部分结果展示):
5.结果分析:
程序获取的结果与预期结果相同,在找到电影名的过程中可以使用find和find_all命令,可以不使用CSS选择器,也可以将电影名存到txt文档,或者excel文档中,便于储存。此程序仅演示豆瓣电影名、电影网络链接,其他静态网页也可通过此方法进行爬取。