Python爬虫之旅_ONE

前言:

最近学习了python的一些基础语法,又跟着廖雪峰老师用异步IO框架搭建了一个简易的网站(虽然有的现在还不懂)不过慢慢来,python还有一个好玩的地方是可以写爬虫,趁着现在有充裕的时间就来学习一下啦,推荐一下小猿圈课程,老师讲的特别好

0x00: 了解爬虫

爬虫在使用场景的分类
——通用爬虫
抓取系统重要组成部分。抓取的是一整张页面数据。
—— 聚焦爬虫
是建立在通用爬虫的基础之上,抓取的是页面特定的局部内容。
——增量式爬虫
监测网站的数据的更新情况,智慧抓取网站中最新更新出来的数据

反爬机制: 门户网站,可以通过制定相应的策略挥着手段,防止爬虫惊醒网站数据的爬虫。
反反爬策略:爬虫程序也可以通过制定相关的策略或者技术手段,破解门户网站中具备的反爬机制,从而获取门户网站中的数据。

robots.txt协议:

君子协议。规定了网站中那些数据可以被爬虫那些数据不可以被爬取

0x01:http&https协议

http协议:

服务器和客户端进行数据交互的一种形式

常见的请求头信息:

User-Agent:请求载体的身份标识
Connection:请求完毕后,是断开连接还是保持连接

常用的响应头信息:

Content-Type: 服务器响应回客户端的数据类型

https协议

安全的超文本传输协议,涉及到数据加密

加密方式:

  1. 对称秘钥加密
  2. 非对称秘钥加密
  3. 证书秘钥加密

对称秘钥加密

客户端先进行数据加密,并将密文和密钥一同发送到服务器端,服务器端利用密钥解开密文。
缺点:容易被拦截,不安全

非对称秘钥加密

例如:RSA这种加密方式

证书秘钥加密

在这里插入图片描述
在这里插入图片描述

0x02:request模块

request模块是python中原生的一款基于网络请求的模块,功能非常强大,而且很高效,作用便是模拟浏览器发起请求,既然是模拟浏览器发起请求,那就需要用request模块做和浏览器相同的工作

request编码流程:

  1. 指定url
  2. 发起请求
  3. 获取响应数据
  4. 持久化存储

练习一:爬取搜狗首页的页面数据(基本流程)

爬取代码:

# 爬取搜狗首页的页面数据
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("爬取成功")

爬取成功
在这里插入图片描述

总结:

这次就先学习到这里,这次学习收获很大,下一篇将记录更好玩的爬虫之旅!!

发布了71 篇原创文章 · 获赞 80 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43431158/article/details/104277393