Python爬虫简介&实例——百度翻译&豆瓣电影的爬取

Python爬虫简介

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本
其实通俗的讲就是通过我们自己写的程序来模拟浏览器访问网页的过程,从而快速高效的获得互联网中的数据

Request & Response

浏览器访问互联网中的服务器以获取数据资源是通过请求的方式进行的,浏览器给服务器发送的消息就叫做HTPP Request,而服务器返回给我们的数据信息就是Response,在浏览器中我们一般可以通过F12按键找到相应的信息,我这里以FireFox为例,当我按下F12后,可以在网络中看到浏览器在访问网页时发送与接收的数据包
在这里插入图片描述
我们点开一个数据包即可在右侧消息头中找到对应的请求头和相应头,也就是我们的Request和Response,这也就是我们的浏览器和服务器之间交换的数据的详细信息
在这里插入图片描述
我们需要关注的是在Request请求头中有一个参数是User-Agent,这是浏览器用于说明自己身份的参数,里面包含了浏览器的引擎版本、浏览器版本信息等等,(更多请参考User-Agent
我们在利用脚本访问网页时,通常需要声明这个参数来表示“我”只是一个普通的浏览器。

同样的,我们在查看Response响应头信息时有时也可以看到有一个参数叫Content-Type用于声明放回的数据为何种类型。(更多请求头和响应头的参数或属性可以点这里参考

AJAX请求

我们需要了解的是这种请求是用于在无需加载整个网页的情况下能够更新部分网页的技术
更多详细信息可以参考这里

Robots协议

robots相当于一种君子协定,用于声明该网站中的哪些内容是可以被爬虫获取的,而哪些内容是不可以被爬虫获取的(更多资料
最简单的robots.txt只有两条规则:
1.User-agent:指定对哪些爬虫生效
2.Disallow:指定要屏蔽的网址
User-agent: * 表示对所有的爬虫以下约定有效
例如这里的baidu.com的robots协议的部分内容
在这里插入图片描述
这部分对本次实例没有直接相关,但是还是希望大家能够遵循该协议,因为
Robots协议是国际互联网界通行的道德规范,基于以下原则建立:
1、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;
2、网站有义务保护其使用者的个人信息和隐私不被侵犯。

爬取百度翻译实例

掌握了上述内容,我们开始做一个最简单的python爬虫,目标是利用我们的爬虫小程序就可以直接得到百度翻译的结果,而不需要打开网页中的百度翻译
首先我们打开百度翻译的页面,首先访问以下该页面的robots.txt,没有发现任何内容
在这里插入图片描述
然后我们随意输入一个单词并F12观察请求包,这里XHR就可以看到AJAX请求,并且可以看到它访问的是百度翻译网站中的/sug目录,User-Agent说明了浏览器的身份
在这里插入图片描述

在这里插入图片描述
并且在响应头中我们也可以看到响应的数据类型是json类型的数据
在这里插入图片描述

我们逐个点开这些请求并观察请求的内容,很快找到我们输入的单词,并且在响应中发现了单词翻译的结果
在这里插入图片描述
在这里插入图片描述
至此我们的目标变得更加清晰,我们需要模拟浏览器发送POST请求,并获取其返回的json数据
上代码
*requests这个库可以直接pip install requests安装

'''
2021/2/24
author:monster663
百度翻译的简易爬取
'''
import requests
url='https://fanyi.baidu.com/sug'
#User-Agent的内容直接从浏览器中复制下来
headers={
	'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
}
key_word=input('请输入你想翻译的单词: ')
data={
	'kw':key_word
}
response=requests.post(url=url,data=data,headers=headers)
#将回显的结果解析
res=response.json()
#print(res)	#原始数据  拿到原始数据我们的目的已经达到,为了更好优化输出我们继续探究
#print(type(res)) 原始数据类型是字典
#print(res['data'])	获取data键对应的数据
#print(type(res['data'])) 发现它是列表类型
#优化输出过程

print('原始单词:'+key_word)
print('翻译结果:')
num=len(res['data'])
#print(num) 翻译结果数量
for i in range(num):
	print(str(i+1)+'.'+str(res['data'][i]['k'])+' '+str(res['data'][i]['v']))

运行测试

多组数据测试均正常,支持中英文的翻译,这样就不需要打开百度翻译页面再进行翻译了
在这里插入图片描述
输出结果可以根据自己的需要进行调整

豆瓣电影排行榜爬取实例

同样的,我们登入豆瓣的官网,首先浏览robots.txt查看哪些内容不能爬取
在这里插入图片描述
然后我们点击排行榜,剧情
在这里插入图片描述
然后我们看到这个页面,发现当我们把页面下拉到底部是,页面会自动刷新更多的电影,我们同样的按下F12查看网络数据包
在这里插入图片描述
同样的我们看到浏览器访问了
https://movie.douban.com/j/chart/top_list并得到了一个json格式的数据,于是我们按照之前的思路上代码

'''
2021/2/24
author:monster663
豆瓣电影的简易爬取
'''
import requests
url='https://movie.douban.com/j/chart/top_list'
#User-Agent的内容直接从浏览器中复制下来
headers={
	'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
}
#start=input('请输入您想从第几部电影开始爬取(第一部电影的下标为0): ')
#默认从第一部电影信息开始爬取
print('电影种类编号:')
print('剧情片[11]		喜剧片[24]')
print('动作片[5]		爱情片[13]')
print('科幻片[17]		动画片[25]')
print('悬疑片[10]		惊悚片[19]')
movie_type=input('请输入您想爬取的电影的种类:')
#这里仅举例一些,更多的可以查看url中的type参数获取

limit=input('请输入您想爬取的电影的数量: ')
params={
	'type':movie_type,	#电影种类
	'interval_id':'100:90',	#好于90%的剧情篇电影
	'action':'',
	'start':0,		#从第几部电影开始取
	'limit':limit	#取得的电影数量
}
response=requests.get(url=url,headers=headers,params=params)
movie_data=response.json()
#print(movie_data)
f=open('movie_data.json','w',encoding='utf-8')
f.write(str(movie_data))
f.close()
print('原始数据已经保存')
num=len(movie_data)
for i in range(num):
	print('['+str(i)+'] 电影名称:'+movie_data[i]['title'])
	print('电影类型:'+str(movie_data[i]['types']))
	print('电影评分:'+movie_data[i]['rating'][0])
	print('主演'+str(movie_data[i]['actors']))
	print('地区:'+str(movie_data[i]['regions']))
	print()

运行测试

我们尝试爬取前十的科幻电影,首先找到科幻电影榜
在这里插入图片描述
运行结果如下:
在这里插入图片描述
可以看到已经正确爬取了电影榜中的相关电影信息

若还有其他疑问欢迎评论区留言或私信

参考文献

Python爬虫简介
Robots协议
AJAX请求
请求头和响应头参数解析
User-Agent解析
感谢上述博主的优秀博文

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

monster663

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值