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=) 运行项目 可以一次运行和定时周期运行。
来源:oschina
链接:https://my.oschina.net/u/4415802/blog/4274967