一 jupyter简单使用
1.1 安装
安装 jupyter
root@darren-virtual-machine:~# pip3 install Jupyter
启动
root@darren-virtual-machine:~# jupyter notebook --allow-root
[I 19:46:20.681 NotebookApp] Serving notebooks from local directory: /root [I 19:46:20.681 NotebookApp] The Jupyter Notebook is running at: [I 19:46:20.681 NotebookApp] http://localhost:8888/?token=64965e6933d9f6b4b94136448c2f3161863cda2e873b1013 [I 19:46:20.681 NotebookApp] or http://127.0.0.1:8888/?token=64965e6933d9f6b4b94136448c2f3161863cda2e873b1013
访问http://127.0.0.1:8888/?token=64965e6933d9f6b4b94136448c2f3161863cda2e873b1013
新建一个forder
1.2 jupyter的基本操作
- 创建cell: a和b
- 删除cell: x和dd
- 切换模式: y和m(代码和markdown模式的切换)
- 执行cell: shift + enter
- 查看帮助信息: shift + Tab
- 补全代码信息: Tab
二 爬虫基础
2.1 爬虫概念
爬虫:爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程。
爬虫的分类
- 通用爬虫 爬取一整张页面的数据, 就是搜索引擎抓取系统的一个重要组成部分
- 聚焦爬虫 建立在通用爬虫的基础上(数据解析(正则, BeautifulSoup4, xpath))
- 增量式爬虫 实时监测网络上的数据,只爬取更新的数据
反爬机制
robots.txt协议 文本协议, 防君子不防小人
disabled
作为学习使用,可以忽略disabled协议
User-Agent检测(User-Agent就是请求载体的身份标识)
包含有系统,浏览器及版本
反反爬策略:使用相关的技术手段来破解相关反爬机制
协议
robots.txt协议
请求头协议
- User-Agent: 请求载体的身份标识
- Connection: close
响应头
Content-Type: 响应数据类型
fidder抓包工具,主要做手机端的一个数据爬取
HTTP和HTTPS
安全加密方式:
对称密钥加密: 客户端加密的数据和密钥一并发给服务器端(缺点是数据和密钥会被截获)非对称密钥加密:服务端生成公私钥,把公钥发给客户端,客户端使用公钥加密数据,发送给服务端,服务端用私钥解密(缺点是公钥无法验证真伪)证书密钥加密: 在非对称密钥加密的基础上,通过第三方证书认证机构对公钥进行数字签名(能够验证公钥真伪)
2.2 requests模块基本使用
requests模块的意义:发送请求获取响应数据
requests模块的作用:模拟浏览器发送请求
requests模块的安装
root@darren-virtual-machine:~/tmp# pip3 install requests
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (2.18.4)
requests模块的编码流程
- 1.指定URL
- 2.向网站发送请求
- 3.获取响应数据
- 4.持久化存储
2.2.1 爬取速购首页
根据上面流程,爬取一个sogou的首页数据
爬虫代码
#需求,导入request模块 import requests #指定url sogou_url = "https://www.sogou.com/" # 2.向网站发送请求 response = requests.get(url=sogou_url) print(response) # 3.获取响应数据 # 使用text方法可以获取到页面文本数据, 使用什么方法取决于服务器返回的数据类型, .json(获取json序列化的数据) .content获取二进制的数据 page_text = response.text print(page_text) # 4.持久化存储 with open("./sogou.html", \'w\', encoding="utf-8") as f: f.write(page_text)
执行完成,查看生成得到代码文件
2.2.2 爬取搜狗指定词条搜索后的页面数据
# 需求:爬取搜狗指定词条搜索后的页面数据 import requests # 1.指定URL url = "https://www.sogou.com/web?query=周杰伦" # 2.向网站发送请求 response = requests.get(url=url) response.encoding = "utf-8" # 给响应对象里面的所有数据进行编码,格式为utf-8,如果不设置,会出现乱码 # 3.获取响应数据 page_text = response.text # 4.持久化存储 with open("./jay.html", \'w\', encoding="utf-8") as f: f.write(page_text)
执行后
打开jayhtml
出现这种情况,是由于使用反爬机制导致的,由于网站有UA检测机制,所以我们需要进行UA伪装,将headers作用到我们的发送请求过程中
反爬机制: UA检测(User-Agent)
反反爬策略: UA伪装
把上面的字典封装到一个请求头里面
# 需求:爬取搜狗指定词条搜索后的页面数据 import requests request_headers = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" } # 1.指定URL url = "https://www.sogou.com/web?query=周杰伦" # 2.向网站发送请求 # 由于网站有UA检测机制,所以我们需要进行UA伪装,将headers作用到我们的发送请求过程中 response = requests.get(url=url,headers=request_headers) response.encoding = "utf-8" # 给响应对象里面的所有数据进行编码,格式为utf-8,如果不设置,会出现乱码 # 3.获取响应数据 page_text = response.text # 4.持久化存储 with open("./jay.html", \'w\', encoding="utf-8") as f: f.write(page_text)
删掉jay.html.重新执行打开
正常打开
2.2.3 破解百度翻译
在使用翻译的时候,当更换翻译的单词,只有局部的页面发上变化,其他是不变的,使用的ajax的动态请求,当我们使用翻译,翻译cat,使用F12查看XHR信息
有以下信息
Request URL: https://fanyi.baidu.com/sug Request Method: POST Status Code: 200 Remote Address: 117.34.61.202:443 Referrer Policy: no-referrer-when-downgrade content-type: application/json; charset=utf-8 kw: ca
使用POST请求
import requests word = input("Please input a word: ") url = "https://fanyi.baidu.com/sug" request_headers = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" } form_data = { "kw": word } response = requests.post(url=url, headers=request_headers, data=form_data) print(response.json())
执行,输入dog
2.2.4 爬取豆瓣电影分类排行榜
https://movie.douban.com/中的电影详情数据
页面分析
访问https://movie.douban.com/,点击排行榜,点击喜剧
使用F12,查看加载数据
在之用滚动条上拉取过程中,会有数据的更新
当使用GET请求时
爬虫代码
import requests url = "https://movie.douban.com/j/chart/top_list" request_headers = { "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36" } form_data = { "type": "24", "interval_id": "100:90", "action":"", "start": "0", "limit": "200" } response = requests.get(url=url, headers=request_headers, params=form_data) page_json = response.json() print(len(page_json), page_json)
执行结果
200 [{\'rating\': [\'9.6\', \'50\'], \'rank\': 1, \'cover_url\': \'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2354179225.jpg\', \'is_playable\': False, \'id\': \'5133063\', \'types\': [\'喜剧\'], \'regions\': [\'英国\'], \'title\': \'憨豆先生精选辑\', \'url\': \'https://movie.douban.com/subject/5133063/\', \'release_date\': \'1997\', \'actor_count\': 8, \'vote_count\': 4692, \'score\': \'9.6\', \'actors\': [\'罗温·艾金森\', \'保罗·布朗\', \'理查德·布赖尔斯\', \'Angus Deayton\', \'罗宾·德里斯科尔\', \'卡罗琳·昆汀\', \'Rudolph Walker\', \'理查德·威尔逊\'], \'is_watched\': False}, {\'rating\': [\'9.5\', \'50\'], \'rank\': 2, \'cover_url\': \'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2578474613.jpg\', \'is_playable\': True, \'id\': \'1292063\', \'types\': [\'剧情\', \'喜剧\', \'爱情\', \'战争\'], \'regions\': [\'意大利\'], \'title\': \'美丽人生\', \'url\': \'https://movie.douban.com/subject/1292063/\', \'release_date\': \'2020-01-03\', \'actor_count\': 29, \'vote_count\': 950297, \'score\': \'9.5\', \'actors\': [\'罗伯托·贝尼尼\', \'尼可莱塔·布拉斯基\', \'乔治·坎塔里尼\', \'朱斯蒂诺·杜拉诺\', \'赛尔乔·比尼·布斯特里克\', \'玛丽萨·帕雷德斯\', \'霍斯特·布赫霍尔茨\', \'利迪娅·阿方西\', \'朱利亚娜·洛约迪切\', \'亚美利哥·丰塔尼\', \'彼得·德·席尔瓦\', \'弗朗西斯·古佐\', \'拉法埃拉·莱博罗尼\', \'克劳迪奥·阿方西\', \'吉尔·巴罗尼\', \'马西莫·比安奇\', \'恩尼奥·孔萨尔维\', \'吉安卡尔洛·科森蒂诺\', \'阿伦·克雷格\', \'汉尼斯·赫尔曼\', \'弗兰科·梅斯科利尼\', \'安东尼奥·普雷斯特\', \'吉娜·诺维勒\', \'理查德·塞梅尔\', \'安德烈提多娜\', \'迪尔克·范登贝格\', \'奥梅罗·安东努蒂\', \'沈晓谦\', \'张欣\'], \'is_watched\': False}, {\'rating\': [\'9.5\', \'50\'], \'rank\': 3, \'cover_url\': \'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2206737207.jpg\', \'is_playable\': True, \'id\': \'1303408\', \'types\': [\'喜剧\', \'动作\', \'爱情\'], \'regions\': [\'美国\'], \'title\': \'福尔摩斯二世\', \'url\': \'https://movie.douban.com/subject/1303408/\', \'release_date\': \'1924-04-21\', \'actor_count\': 11, \'vote_count\': 12068, \'score\': \'9.5\', \'actors\': [\'巴斯特·基顿\', \'凯瑟琳·麦奎尔\', \'乔·基顿\', \'Ward Crane\', \'Jane Connelly\', \'George Davis\', \'Doris Deane\', \'Betsy Ann Hisle\', \'丘比·摩根\', \'John Patrick\', \'Ford West\'], \'is_watched\': False}, {\'rating\': [\'9.5\', \'50\'], \'rank\': 4, \'cover_url\': \'https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2527089368.jpg\', \'is_playable\': False, \'id\': \'30203557\', \'types\': [\'喜剧\'], \'regions\': [\'中国香港\'], \'title\': \'黄子华栋笃笑之金盆