python爬虫
第一个爬虫
from urllib.request import urlopen
resp = urlopen("http://www.baidu.com") # 打开 百度
print(resp.read().decode("utf-8")) # 打印 抓取到的内容
with open("baidu.html",mode="w", encoding="utf-8")
as f: # 创建⽂件
f.write(resp.read().decode("utf-8")) # 保存在⽂件中
web请求过程
⻚⾯渲染数据的过程
1.服务器渲染
我们在请求到服务器的时候, 服务器直接把数据全部写⼊到html中, 我们浏览器就 能直接拿到带有数据的html内容. ⽐如, 由于数据是直接写在html中的, 所以我们能看到的数据都在⻚⾯ 源代码中能找的到的. 这种⽹⻚⼀般都相对⽐较容易就能抓取到⻚⾯内容
2.前端JS渲染
这种就稍显麻烦了. 这种机制⼀般是第⼀次请求服务器返回⼀堆 HTML框架结构. 然后再次请求到真正保存数据的服务器, 由这个服务器返回数据, 最后在浏览器上对数据进⾏加载
HTTP协议
HTTP协议把⼀条消息分为三⼤块内容. ⽆论是请求还是响应都是三块内容
请求
请求⾏ -> 请求⽅式(get/post) 请求url地址 协议 请求头 -> 放⼀些服务器要使⽤的附加信息 请求体 -> ⼀般放⼀些请求参数
响应
状态⾏ -> 协议 状态码 响应头 -> 放⼀些客户端要使⽤的⼀些附加信息 响应体 -> 服务器返回的真正客户端要⽤的内容(HTML,json)等
请求头中最常⻅的⼀些重要内容(爬⾍需要):
User-Agent : 请求载体的身份标识(⽤啥发送的请求)
Referer: 防盗链(这次请求是从哪个⻚⾯来的? 反爬会⽤到)
cookie: 本地字符串数据信息(⽤户登录信息, 反爬的token)
响应头中⼀些重要的内容:
cookie: 本地字符串数据信息(⽤户登录信息, 反爬的token)
各种神奇的莫名其妙的字符串(这个需要经验了, ⼀般都是token 字样, 防⽌各种攻击和反爬)
请求方式:
Get
- Query String Parameters
Post
- form data
pip清华园镜像
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
requests实例
案例1. 抓取搜狗搜索内容
kw = input("请输⼊你要搜索的内容:")
response = requests.get(f"https://www.sogou.com/web?query={kw}") # 发送get请求
# print(response.text) # 直接拿结果(⽂本)
with open("sogou.html", mode="w", encoding="utf-8") as f:
f.write(response.text)
案例2.抓取百度翻译数据
# 准备参数
kw = input("请输⼊你要翻译的英语单词:")
dic = {
"kw": kw # 这⾥要和抓包⼯具⾥的参数⼀致.
}
# 请注意百度翻译的sug这个url. 它是通过post⽅式进⾏提交的. 所以我们也要模拟post请求
resp = requests.post("https://fanyi.baidu.com/sug",data=dic) # 返回值是json 那就可以直接解析成json
resp_json = resp.json() # {'errno': 0, 'data': [{'k': 'Apple', 'v': 'n.苹果公司,原称苹果电脑公司'....
print(resp_json['data'][0]['v']) # 拿到返回字典中的内容
案例3: 抓取⾖瓣电影
url = 'https://movie.douban.com/j/chart/top_list'
param = {
'type': '24',
'interval_id': '100:90',
'action':'',
'start': '0',#从库中的第⼏部电影去取
'limit': '20',#⼀次取出的个数
}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
}
response = requests.get(url=url,params=param,headers=headers)
list_data = response.json()
fp = open('./douban.json','w',encoding='utf-8')
json.dump(list_data,fp=fp,ensure_ascii=False)
print('over!!!')