一、准备工作
0、爬虫的分类:
-
通用爬虫:爬取整张页面;
-
聚焦爬虫:爬取页面中指定的页面内容,需要用到数据解析(75%以上的需求都是需要用到聚焦爬虫);
-
增量爬虫:
1、首先得要具备的基础知识:
-
Python基础;
-
IDE(Pycharm等)的使用;
-
pip工具的使用;
-
pip国内镜像源的安装:
-
在资源浏览器输入 %appdata%,进入;
-
创建一个pip.ini文件:
[global] timeout = 6000 index-url=http://mirrors.aliyun.com/pypi/simple/ trusted-host=mirrors.aliyun.com
http(https)协议的基础知识;
2、Python中涉及到网络请求的两个模块:
-
urllib模块:有点过时,操作有点麻烦;
-
requests模块:用法简洁,高效;
-
Python中原生的一款网络请求模块,功能非常强大,简单便捷,效率极高;
-
作用:模拟浏览器发请求(爬虫的核心思想)。
3、requests模块如何使用?
-
指定url
-
发起请求
-
获取响应数据
-
持久化存储
4、requests模块的安装
# 安装 pip install requests
最简单使用demo:
# 标准四步,爬取sogou首页数据
import requests
if __name__ == '__main__':
# 1、指定url
url = "https://www.sogou.com"
# 2、发起请求,get请求会返回一个响应对象response
response = requests.get(url=url)
# 3、获取响应数据,text返回的是字符串形式的响应数据
page_text = response.text
# 4、持久化存储,以最简单的文件的方式存储在本地
with open('./sogou.html', 'w', encoding='utf-8') as fp:
fp.write(page_text)
print('爬取数据结束...')
二、实战小功能案例
1、UA伪装 — 简易网页采集器:
UA:User Agent;
UA检测:很多网站的服务器会检测对应请求的载体的身份标识,如果UA为某一款浏览器,那么服务器就认为这是一个正常的浏览器请求,如果发现UA不是任一款浏览器,那么可能就认为这不是正常请求,来自于爬虫,可能就会让我们的请求失败;
UA伪装:让爬虫对应的请求载体中的UA伪装成某一款浏览器;
import requests
if __name__ == '__main__':
# UA伪装,将伪装的UA信息,封装在一个字典(Dict 类似于Java中的Map)中
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
# 1、封装url (https://www.sogou.com/web?query=吉桂权)
url = 'https://www.sogou.com/web'
# 准备url中需要的query参数,封装到字典中:
kw = input('请输入您要查询的关键字:')
params = {
'query':kw
}
# 2、发起请求
response = requests.get(url=url, params=params, headers=headers)
# 3、获得响应数据
page_text = response.text
# 4、数据的后期处理,直接存储在本地文件
fileName = './output/' + kw+'.html'
with open(fileName, 'w', encoding='utf-8') as fp:
fp.write(page_text)
print(fileName, '保存成功...')
小功能测试就不贴图了!(●'◡'●)
2、破解百度翻译:
通过浏览器F12分析,我们可以知道百度翻译每一次翻译,是发送的一次AJAX_POST请求,请求的响应体为json格式的数据;
import requests
import json
if __name__ == '__main__':
# UA伪装
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
# 1、封装url (https://fanyi.baidu.com/sug)
url = 'https://fanyi.baidu.com/sug'
# 准备post数据体
kw = input('请输入您要翻译的内容:')
data = {
'kw': kw
}
# 2、发送post请求
response = requests.post(url=url, data=data, headers=headers)
# 3、获得响应数据,判断是否为json格式的数据
if 'application/json' == response.headers['Content-Type']:
resp_obj = response.json()
# 4、对数据进行处理,存储到本地的json文件中
fileName = './output/' + kw + '.json'
with open(fileName, 'w', encoding='utf-8') as fp:
json.dump(resp_obj, fp, ensure_ascii=False)
print(kw, '翻译完成...')
此等小功能测试也不用贴图了吧!O(∩_∩)O
3、豆瓣电影排行榜——以喜剧电影为例:
同样的,我们还是要到浏览器上分析一下方案,发现豆瓣电影排行榜是以AJAX_GET的方式,分页懒加载获取数据的,数据返回体依然为JSON
话不多说,直接coding:
import requests
import json
if __name__ == '__main__':
# UA伪装
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
# 1、封装url (https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=20&limit=20)
url = 'https://movie.douban.com/j/chart/top_list'
# 准备post数据体
params = {
'type': '24',
'interval_id': '100:90',
'action': '',
'start': '0',
'limit': '20'
}
# 2、发送post请求
response = requests.get(url=url, params=params, headers=headers)
# 3、获得响应数据,判断是否为json格式的数据
resp_obj = response.json()
print(resp_obj)
# 4、对数据进行处理,存储到本地的json文件中
fileName = './output/豆瓣.json'
with open(fileName, 'w', encoding='utf-8') as fp:
json.dump(resp_obj, fp, ensure_ascii=False)
print('抓取豆瓣电影排行榜完成...')
执行结果‘豆瓣.json’:
没有问题!( ̄▽ ̄)"





