您的位置:首页 > 编程语言 > Python开发

python学习之ajax和可视化管理工具

2020-04-22 00:36 381 查看

Ajax爬虫

  1. 浏览器中可看到正常显示的数据,但使用requests得到的结果并没有。 这是什么原因呢?
    requests获取的是原始的HTML文档,而浏览器中的页面是经过JS处理数据后生成的结果。
  2. 这些数据的来源有哪些情况呢?
    Ajax加载、包含在HTML文档中、经过JavaScript和特定算法计算后生成

    Ajax(Asynchronous JavaScript and XML)异步的JS和XML。原理是: 利用JS在保证页面
    不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。

    Ajax如何分析页面?

    拖动刷新的内容由Ajax加载且页面的URL无变化,那么应该到哪里去查看这些Ajax请求呢?

  3. 开发者工具(F12)->Network选项卡, 获取页面加载过程中Browser与Server之间请求和响
    应。
  4. 筛选出所有的Ajax请求。在请求的上方有一层筛选栏,直接点击XHR(Ajax特殊的响应类型)
  5. 模拟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=)
运行项目
可以一次运行和定时周期运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: