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

Ajax爬虫

浏览器中可看到正常显示的数据,但使用requests得到的结果并没有。 这是什么原因呢?

requests获取的是原始的HTML文档,而浏览器中的页面是经过JS处理数据后生成的结果。

这些数据的来源有哪些情况呢?

Ajax加载、包含在HTML文档中、经过JavaScript和特定算法计算后生成

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Ajax(Asynchronous JavaScript and XML)异步的JS和XML。原理是: 利用JS在保证页面

不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

Ajax如何分析页面?

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

开发者工具(F12)->Network选项卡, 获取页面加载过程中Browser与Server之间请求和响

应。

筛选出所有的Ajax请求。在请求的上方有一层筛选栏,直接点击XHR(Ajax特殊的响应类型)

模拟Ajax请求,提取我们所需要的信息。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

打开Ajax的XHR过滤器,然后一直滑动页面以加载新的微博内容。可以看到,会不断有

Ajax请求发出。请求的参数有4个:type、value、containerid和page。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

基于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=)

运行项目

可以一次运行和定时周期运行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值