前言:
最近学习了python的一些基础语法,又跟着廖雪峰老师用异步IO框架搭建了一个简易的网站(虽然有的现在还不懂)不过慢慢来,python还有一个好玩的地方是可以写爬虫,趁着现在有充裕的时间就来学习一下啦,推荐一下小猿圈课程,老师讲的特别好
0x00: 了解爬虫
爬虫在使用场景的分类
——通用爬虫
:
抓取系统重要组成部分。抓取的是一整张页面数据。
——聚焦爬虫
:
是建立在通用爬虫的基础之上,抓取的是页面特定的局部内容。
——增量式爬虫
:
监测网站的数据的更新情况,智慧抓取网站中最新更新出来的数据
反爬机制
: 门户网站,可以通过制定相应的策略挥着手段,防止爬虫惊醒网站数据的爬虫。
反反爬策略
:爬虫程序也可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而获取门户网站中的数据。
robots.txt
协议:君子协议。规定了网站中那些数据可以被爬虫那些数据不可以被爬取
0x01:http&https协议
http协议:
服务器和客户端进行数据交互的一种形式
常见的请求头信息:
User-Agent:请求载体的身份标识
Connection:请求完毕后,是断开连接还是保持连接
常用的响应头信息:
Content-Type: 服务器响应回客户端的数据类型
https协议
安全的超文本传输协议,涉及到数据加密
加密方式:
- 对称秘钥加密
- 非对称秘钥加密
- 证书秘钥加密
对称秘钥加密
客户端先进行数据加密,并将密文和密钥一同发送到服务器端,服务器端利用密钥解开密文。
缺点:容易被拦截,不安全
非对称秘钥加密
例如:RSA这种加密方式
证书秘钥加密
0x02:request模块
request
模块是python中原生的一款基于网络请求的模块,功能非常强大,而且很高效,作用便是模拟浏览器发起请求,既然是模拟浏览器发起请求,那就需要用request
模块做和浏览器相同的工作
request
编码流程:
- 指定url
- 发起请求
- 获取响应数据
- 持久化存储
练习一:爬取搜狗首页的页面数据(基本流程)
爬取代码:
# 爬取搜狗首页的页面数据
import requests
if __name__ == "__main__":
#setp1 指定url
url = 'https://www.sogou.com/'
#setp2 发起请求
#get方法返回一个响应对象
response = requests.get(url=url)
#setp3 获取响应数据
#text返回的是字符串形式的响应数据
page_text = response.text
print(page_text)
#setp4 持久化存储
with open('D:/爬虫/sogou.html','w',encoding='utf-8') as f:
f.write(page_text)
print('爬取完成')
响应:
练习二:网页采集器(GET)
在编写前,需要来了解一些反爬机制:
UA
: User-Agent(请求载体的身份标识)
UA检测
:门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一个浏览器说明该请求是一个正常的请求,但是,如果检测到请求的载体身份标识不是基于某一款浏览器的,则表示该请求为不正常的请求(爬虫),则服务器端就很有可能拒绝该次请求。
UA伪装
:将对应的User-Agent封装到一个字典中,加入代码中。
这里就爬取搜狗浏览器
比如搜索刀剑神域时,后面跟了一堆参数,但有一个参数query
特别明显,这个参数就是我们要查询的内容,只保留这个参数,发现还是可以查询的,这样url就比较好指定了
除此之外,还需要添加上UA伪装,防止被拒绝
下面就来编写爬取代码:
import requests
if __name__ == "__main__":
#UA伪装,封装到一个字典中
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
#指定url
url = "https://www.sogou.com/sogou"
#自定义参数
kw = input('please input param')
#将参数封装到字典中
param = {
'query': kw
}
#发起请求,第二个参数将自定义的参数传进去,第三个参数传入header
reponse = requests.get(url=url,params=param,headers=header)
#获取响应信息
page_text = reponse.text
#保存信息
fileName = kw+'.html'
with open(fileName,'w',encoding='utf-8') as f:
f.write(page_text)
print("爬取成功")
爬取成功
如果想要爬取其他内容,只需要更改参数即可
练习三:破解百度翻译(Post)
在编写前先要了解一下Ajax
AJAX
是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新
打开百度翻译,发现页面局部刷新,这里使用了Ajax
,请求成功后会将局部的进行一个刷新 ,因此只要捕获对应的Ajax
请求,就可以将对应的翻译的结果存储到json
的文本文件当中
为什么要存储到json
的文本文件当中,我们捕获一下服务器端的返回信息就可以知道
接下来就去捕获Ajax
请求,比如输入dog
,捕捉到了对应的参数,接下来就写爬取代码
import requests
import json
#指定post的url
post_url = 'https://fanyi.baidu.com/sug'
#UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
#自定义post参数
word = input('please input')
data = {
'kw': word
}
#发起请求
post_response = requests.post(url=post_url,data=data,headers=headers)
#获取响应
#注:获取响应数据json()方法返回的是obj(如果确认响应数据是json,才可以使用json())
dict_text = post_response.json()
# print(dict_text)
#保存数据
fileName = word+'.json'
fp = open(fileName,'w',encoding = 'utf-8')
#注:因为返回来的json串是中文的,所以ensure_ascii为false,不能使用ascii进行编码
json.dump(dict_text,fp=fp,ensure_ascii=False)
print('Finish')
爬取成功
练习四:爬取豆瓣电影
随便点一个类型的电影,往下面查看时会发现每次当页面为20部电影时,稍微等一会就可以继续往下查看更多未显示的电影,网页是没有任何变化的,只是局部的变化,因此可以捕捉一下Ajax
请求
Ajax
请求时便会携带这些参数,那既然知道了携带的是什么参数,就可以编写爬取脚本了
# 爬取豆瓣电影
import requests
import json
if __name__ =="__main__":
url="https://movie.douban.com/j/chart/top_list"
#参数
params = {
"type":"24",
"interval_id": "100:90",
"action":"",
"start": "0",
"limit": "20",
}
#UA伪装
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"
}
#请求
r=requests.get(url=url,params=params,headers=headers)
#反应
data=r.json()
#存储
fp = open("电影.json","w",encoding="utf-8")
#indent: 缩进(例如indent=4,缩进4格);
json.dump(data,fp=fp,ensure_ascii=False,indent=4)
print("爬取成功")
作业:爬取肯德基餐厅的位置信息
当查询餐厅时,只是局部页面发生了变化,因此可以确定是Ajax
,所以去捕获一下请求
是通过POST
的方式进行请求
注意这里不再是json
类型的,而是text
,
编写爬虫代码:
import requests
if __name__ == "__main__":
url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
key = input("Please enter the query address\n")
page = input("Please enter the query page number\n")
data = {
'cname':'',
'pid': '',
'keyword':key,
'pageIndex':page,
'pageSize': '10',
}
reponse = requests.post(url=url,data=data,headers=headers)
data = reponse.text
print(data)
fileName = key+'.txt'
with open(fileName,'w',encoding='utf-8') as fp:
fp.write(data)
print("爬取成功")
爬取成功
总结:
这次就先学习到这里,这次学习收获很大,下一篇将记录更好玩的爬虫之旅!!