Ajax 爬虫
浏览器中可看到正常显示的数据, 但使用 requests 得到的结果并没有. 这是什么原因呢?
requests 获取的是原始的 html 文档, 而浏览器中的页面是经过 JS 处理数据后生成的结果.
这些数据的来源有哪些情况呢?
Ajax 加载, 包含在 HTML 文档中, 经过 JavaScript 和特定算法计算后生成
Ajax(Asynchronous JavaScript and xml)异步的 JS 和 xml. 原理是: 利用 JS 在保证页面
不被刷新, 页面链接不改变的情况下与服务器交换数据并更新部分网页的技术.
Ajax 如何分析页面?
拖动刷新的内容由 Ajax 加载且页面的 URL 无变化, 那么应该到哪里去查看这些 Ajax 请求呢?
开发者工具(F12)->Network 选项卡, 获取页面加载过程中 Browser 与 Server 之间请求和响
应.
筛选出所有的 Ajax 请求. 在请求的上方有一层筛选栏, 直接点击 XHR(Ajax 特殊的响应类型)
模拟 Ajax 请求, 提取我们所需要的信息.
打开 Ajax 的 XHR 过滤器, 然后一直滑动页面以加载新的微博内容. 可以看到, 会不断有
Ajax 请求发出. 请求的参数有 4 个: type,value,containerid 和 page.
基于 Ajax 和 requests 采集器的微博爬虫
- import os
- import requests
- from colorama import Fore
- from fake_useragent import UserAgent
- from requests import HTTPError
- def download_page(url, parmas=None):
- """
- 根据 url 地址下载 html 页面
- :param url:
- :param parmas:
- :return: str
- """
- try:
- ua = UserAgent()
- headers = {
- 'User-Agent': ua.random,
- }
- # 请求 https 协议的时候, 回遇到报错: SSLError
- #verify=Flase 不验证证书
- response = requests.get(url, params=parmas, headers=headers)
- except HTTPError as e:
- print(Fore.RED + '[-] 爬取网站 %s 失败: %s' % (url, str(e)))
- return None
- else:
- # content 返回的是 bytes 类型, text 返回字符串类型
- #response.JSON()方法会自动将字符串反序列为 python 数据类型
- """
- html = response.text # 字符串
- json.loads(html) # 将字符串反序列化为 python 数据类型
- """
- #return response.JSON()
- return response
- def parse_html(HTML):
- """
- 参考源代码解析
- :param html:
- :return:
- """cards = HTML.get('data').get('cards')
- count = 0
- for card in cards:
- try:
- count += 1
- text = card['mblog'].get('text')
- pics = card['mblog'].get('pics')
- #todo: 1. 对于博客正文的内容进行处理: 删除标签(正则 + re.sub)
- print("第 %s 篇微博正文内容: %s" % (count, text))
- if pics:
- for index, pic in enumerate(pics):
- pic_url = pic.get('url')
- pic_content = download_page(pic_url).content
- # 图片网址 -> 图片名称 https://wx1.sinaimg.cn/orj360/005N3SJDly1fyhlxakcj3j30dc0dcaa4.jpg
- img_fname = os.path.join('weibo_pics', pic_url.split('/')[-1])
- with open(img_fname, 'wb') as f:
- f.write(pic_content)
- print("下载第 [%s] 张图片成功" % (index + 1))
- except Exception as e:
- print("下载博客失败: %s" % (str(e)))
- if __name__ == '__main__':
- uid = input("请输入你要爬取微博博主的 uid:")
- for page in range(10):
- url = 'https://m.weibo.cn/api/container/getIndex?uid=%s&type=uid&containerid=107603%s&page=%s' % (
- uid, uid, page)
- HTML = download_page(url).JSON()
- parse_html(HTML)
Scrapy 可视化管理工具
Scrapyd
Scrapyd 是一个用于部署 scrapy 项目和通过 HTTP API 控制爬虫的服务软件.
官方文档: http://scrapyd.readthedocs.org/
GitHub 项目地址: https://github.com/scrapy/scrapyd
Scrapyd 使用教程
安装 pip install scrapyd
运行 scrapyd 命令, 访问 127.0.0.1:6800 可看到可视化界面
Scrapyd 工作原理
服务器端(scrapyd): 运行客户端部署的爬虫.
客户端(scrapyd-client): 将本地的 scrapy 项目打包发送到 scrapyd 这个服务端
安装 scrapyd-client: pip install scrapyd-client
部署 Scrapy 项目使用教程
scrapy 项目配置 scrapy.cfg 文件
其中的 username 和 password 用于在部署时验证服务器的 HTTP basic authentication, 须要注
意的是这里的用户密码并不表示访问该项目须要验证, 而是登录服务器用的.
[settings] default = ScrapyProject.settings #demo 用来标识项目, 可任意命名, 不指定时. 标识名默认是 default [deploy:demo] # 部署爬虫到目标服务器(url) url = http://localhost:6800/ project = ScrapyProject username = admin # 访问服务器所需的用户名和密码(如果不需要密码可以不写) password = westos123
scrapyd-deploy 部署项目
# 将本地爬虫项目部署到远程服务器端 scrapyd-deploy demo -p ScrapyProject # 运行命令查看服务端状态 curl http://localhost:6800/daemonstatus.JSON
查看项目 spider
通过 scrapyd-deploy -l 查看当前目录下的可以使用的部署方式(target)
scrapy list scrapyd-deploy -l scrapyd-deploy -L xxxx
``` 易错点: scrapyd-deploy 运行时显示无此命令, 在 Linux/Mac 系统不会出现该报错, 那么
Windows 系统的特殊设置:
# 获取 Python 路径: where Python # 编辑文件: Python 路径 \ Scripts\scrapyd-deploy.bat @echo off "D:\Software\Anaconda3\envs\electricity\python.exe" "D:\Software\Anaconda3\envs\electricity\Scripts\scrapyd-deploy" %*
Scrapyd API 接口
scrapyd 的 web 界面比较简单, 主要用于监控, 所有的调度工作全部依靠接口实现.
官方文档: http://scrapyd.readthedocs.org/en/stable/api.html
开启爬虫 schedule
curl http://localhost:6800/schedule.JSON -d project = 项目名称 -d spider = 爬虫名称
停止 cancel
curl http://localhost:6800/cancel.JSON -d project = 项目名称 -d job=jobID
列出爬虫
curl http://localhost:6800/listspiders.JSON?project = 项目名称
删除项目
curl http://localhost:6800/delproject.JSON -d project = 项目名称
SpiderKeeper 可视化部署
SpdierKeeper 通过配合 scrpyd 管理爬虫, 支持一键式部署, 定时采集任务, 启动, 暂停等一系列的操作. 原理
是: 对 scrapyd 的 API 进行封装, 最大限度减少你跟命令行交互次数.
依赖包安装
scrapy scrapyd SpiderKeeper
启动 SpiderKeeper
spiderkeeper --server=http://localhost:6800
启动成功后, 在浏览器访问 127.0.0.1:5000, 效果如下:
![](https://s4.51cto.com/images/blog/202004/22/e2dd23205d0eca01c1130ac40ae5ba65.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=) ### 创建项目
若使用 scrpayd-deploy 工具部署后, spiderkeeper 无法自动识别出部署的项目, 必须在网页中手动部
署.
在 scrpay 项目中 scrapy.cfg 文件中写好 scrapyd 服务器信息
生成 egg 文件命令:
scrapyd-deploy --build-egg output.egg ### 上传文件 ![](https://s4.51cto.com/images/blog/202004/22/4557082762a55acd287d320fe3b7c9d9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
运行项目
可以一次运行和定时周期运行.
来源: http://blog.51cto.com/13810716/2489208