首页 > 编程语言 > 详细

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

时间:2020-04-22 23:56:32      阅读:116      评论:0      收藏:0      [点我收藏+]
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=)
运行项目
可以一次运行和定时周期运行。

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

原文:https://blog.51cto.com/13810716/2489208

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!