一、准备工作
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’:
没有问题!( ̄▽ ̄)"