美文网首页
Python scrapy全家桶

Python scrapy全家桶

作者: sdupidBoby | 来源:发表于2023-07-27 16:55 被阅读0次
    python奇淫技巧:
    • 生成器:yeild
    • 枚举 enumerate
    • 数据可以添加不同类型数据 :[str,float,dic,bool]
    • 使用一行代码赋值多个变量 :one, two, three, four = 1, 2, 3, 4
    • 重复字符串
    name = "Banana"
    print(name * 4)  # BananaBananaBananaBanana
    

    scrapy 依赖包:
    lxml, 一个高效的XML和HTML解析器
    parsel ,一个写在lxml上面的html/xml数据提取库,
    w3lib , 用于处理URL和网页编码的多用途帮助程序
    twisted , 异步网络框架
    cryptography 和 pyOpenSSL , 处理各种网络级安全需求


    日后服务对象:重庆市互联网新闻信息服务许可公示


    scrapy框架:

    scrapy框架包括5个主要的组件和2个中间件Hook。


    engine:整个框架的控制中心, 控制整个爬虫的流程。根据不同的条件添加不同的事件(就是用的Twisted)
    scheduler:事件调度器
    downloader:接收爬虫请求,从网上下载数据
    spider:发起爬虫请求,并解析DOWNLOADER返回的网页内容,同时和数据持久化进行交互,需要开发者编写
    item piplines:接收SPIDERS解析的结构化的字段,进行持久化等操作,需要开发者编写
    middlewares:engine和spider, engine和downloader之间一些额外的操作,hook的方式提供给开发者

    从上可知,我们只要实现 :
    spider(要爬什么网站,怎么解析)和
    item piplines(如何处理解析后的内容)就可以了。其他的都是有框架帮你完成了。


    一、scrapy

    安装:

    pip install scrapy #项目根目录下安装 scrapy
    pip show scrapy  #查看版本信息
    
    1. 使用scrapy新建爬虫项目
    scrapy startproject sexy  #新建爬虫, sexy是项目的名称
    
    2. 新建爬虫
    #mySpider/spider目录下创建一个名为itcast的爬虫,并指定爬取域(域名)的范围
    scrapy genspider spiderName  "cbg.cn" 
    
    2(1).创建CrawlSpider爬虫文件
    scrapy genspider -t crawl spiderName  'cbg.cn'
    

    常用命令

    #1 查看帮助
    scrapy -h
    scrapy <command> -h
    
    #2 有两种命令:其中Project-only必须切到项目文件夹下才能执行,而Global的命令则不需要
    Global commands:
        startproject #创建项目
        genspider    #创建爬虫程序
        settings     #如果是在项目目录下,则得到的是该项目的配置
        runspider    #运行一个独立的python文件,不必创建项目
        shell        #scrapy shell url地址  在交互式调试,如选择器规则正确与否
        fetch        #独立于程单纯地爬取一个页面,可以拿到请求头
        view         #下载完毕后直接弹出浏览器,以此可以分辨出哪些数据是ajax请求
        version      #查看scrapy的版本
    
    Project-only commands:
        crawl        #运行爬虫,必须创建项目才行,确保配置文件中ROBOTSTXT_OBEY = False
        check        #检测项目中有无语法错误
        list         #列出项目中所包含的爬虫名
        edit         #编辑器,一般不用
        parse        #scrapy parse url地址 --callback 回调函数
        bench        #scrapy bentch压力测试
    
    3. 爬虫运行

    3(1). python脚本运行
    使用终端运行太麻烦了,而且不能提取数据,我们一个写一个run文件作为程序的入口,splite是必须写的,目的是把字符串转为列表形式,第一个参数是scrapy,第二个crawl,第三个爬虫名字spiderName

    from scrapy import cmdline
    cmdline.execute(‘scrapy crawl baidu’.split())
    

    3(2).终端执行:执行 需要到scrapy.cfg同级别的目录执行(爬虫目录)

    #   sexy 是SexySpider中的name
    scrapy crawl   sexy   
    scrapy crawl spiderName --nolog  # --nolog不显示日志 
    # json格式,默认为Unicode编码
    scrapy crawl spiderName -o teachers.json
    # json lines格式,默认为Unicode编码
    scrapy crawl spiderName -o teachers.jsonl
    # csv 逗号表达式,可用Excel打开
    scrapy crawl spiderName -o teachers.csv
    # xml格式
    scrapy crawl spiderName -o teachers.xml
    

    4. 爬虫编写

    4(1).pipeline

    写入到Excel表格:

    import openpyxl
    import os
    import time
    
    # 开启 pipeline 需到 setting.py里面 ITEM_PIPELINES 去开启
    class SjkbSpiderPipeline:
        def __init__(self):
            self.pipeName = "视界快报-0720"
            self.wb = openpyxl.Workbook()  # 工作簿
            self.ws = self.wb.active  # 工资表
            self.ws.title = self.pipeName
            self.ws.append(('标题', '链接', '类型', '图片', '视频'))
    
            times = time.time()
            local_time = time.localtime(times)
            local_time_format = time.strftime("%Y-%m-%d-%H-%M", local_time)
    
            saveFloder= 'tmpDatafloder'  #文件名
            if not os.path.exists(saveFloder):  #检查目录是否存在
                os.mkdir(saveFloder)    #新建文件夹
            self.save_path = os.getcwd() + "/" + saveFloder + "/spider-" + self.pipeName + local_time_format + ".xlsx"
    
        def close_spider(self, spider):
            self.wb.save(self.save_path)
            print("关闭爬虫......")
    
        # 回调函数 -->callback
        def process_item(self, item, spider):
    
            title = item.get('title', '')
            linkUrl = item.get('linkUrl', '')
            type = item.get('type', '')
            thumb = item.get('thumb', '')
            video = item.get('video', '')
    
            self.ws.append((title, linkUrl, type, thumb, video))
            return item
    
    
    4(2).Xpath

    解析常用方法:

    四种:
    第一种写法拿到selector选择器,也就是原数据,里面有一些我们用不到的东西。
    
    第二:extract()  and getall()方法:
    返回所有的元素:将选择器序列号为字符串(获取的是一个列表内容)。
    
    第三个和第四个一样:
    拿到字符串里的第一个数据,也就是我们要的数据。
    
    items[‘name’]=i.xpath(‘./a/@title’)[0]
    items[‘name’]=i.xpath(‘./a/@title’).extract()
    items[‘name’]=i.xpath(‘./a/@title’).extract_first()
    items[‘name’]=i.xpath(‘./a/@title’).get()
    
    response.xpath('//div[@class="main-pages"]/a[text()="下一页"]/@href').get()
    response.xpath('//article[@class="main-article"]/div[@class="article-video"]/video/@src')
    response.xpath(
                '//article[@class="main-article"]/div[@class="article-title"]/h1/text()')
    

    常见的几个 response 方法。

    * response.body.decode("utf-8"):返回 HTML 并设置字符集编码
    * response.url:返回 URL
    * response.urljoin("dsadasd"):返回 URL 拼接后的结果
    

    二、 爬虫部署scrapyd服务

    scrapyd提供了一个客户端工具,就是scrapyd-client,使用这个工具对scrapyd这个服务进行操作,比如:向scrapyd服务打包上传项目。scrapyd-client类似于redis-cli.exe、MongoDB数据库的client。

    1. 安装并启动scrapyd

    pip install scrapyd #项目根目录下安装 scrapyd
    . 运行scrapyd,可以单独新建一个文件夹,作为运行目录(会新建很多文件)
    $ scrapyd
    scrapyd配置: scrapyd.conf(default_scrapyd.conf) 所在目录:
    C:\Users\19115\Desktop\Python代码\python_20230704\venv\Lib\site-packages\scrapyd\default_scrapyd.conf

    如果需要外网访问,必须 配置用户名和密码,以免遭受到网络攻击:

    [scrapyd]
    username    = 
    password    =
    
    2. 安装并使用scrapyd-client部署爬虫

    pip install scrapyd-client #项目根目录

    爬虫配置
    我这里的scrapy.cfg配置如下(cd 到爬虫目录):

    [settings]
    default = sjkb_spider.settings
    
    [deploy:sjkb]
    url = http://localhost:6800/
    project = sjkb_spider
    如果scrapyd配置了账号密码,则在这里也需要添加账号密码配置,复制过来即可
    
    2(1). 打包发布工程到我们的scrapyd:

    查看当前可用于打包上传的爬虫项目:
    命令:scrapyd-deploy -l
    打包:
    scrapyd-deploy serverName -p PROJECT_NAME (#这个需要cd到爬虫目录(scrapy.cfg同级)下执行)
    scrapyd-deploy sjkb -p sjkb_spider (打包sjkb_spider爬虫,跟上面配置对应起来, 打包的egg会上传到scrapy.cfg配置的域名目录/egg/下

    通过AP接口,查看已经上传至scrapyd服务的项目:(#根目录)
    命令:curl.exe http://localhost:6800/listprojects.json 本地项目
    curl.exe http://172.50.18.87:6800/listprojects.json(18.87服务器项目)
    通过API接口,查看某一个项目中的所有爬虫名称:(#根目录)
    命令:curl http://localhost:6800/listspiders.json?project=jobbolespider

    获取爬虫运行状态
    命令:curl.exe http://localhost:6800/listjobs.json?project=niuBproject(#根目录)

    3. 使用curl启动我们的爬虫

    通过API接口,启动爬虫项目:
    curl http://localhost:6800/schedule.json -d project=PROJECT_NAME -d spider=SPIDER_NAME(语法)
    curl http://localhost:6800/schedule.json -d project=sjkb_spider -d spider=sjkbSpider
    实例(添加exe是因为windows下curl被Invoke-WebRequest别名占用了):
    curl.exe http://localhost:6800/schedule.json -d project=sjkb_spider -d spider=sjkbSpider(可用)
    curl.exe http://localhost:6800/schedule.json -d project=niuBproject -d spider=niub_sjw(可用)

    curl http://localhost:6800/schedule.json, data={"project":"sjkb_spider","spider":"sjkbSpider"}改变语法,运行依然报错了*(后面再来调试)

    取消爬虫任务
    jobid:是根据项目(jobbolespider)和爬虫(bole)生成的一个id,
    命令:curl http://localhost:6800/cancel.json -d project=项目名称 -d job=jobid

    删除项目
    curl http://localhost:6800/delproject.json -d project=项目名

    三、图形化-调度管理爬虫:

    1. scrapydweb,scrapydart,SpiderAdmin,SpiderKeeper等

    (scrapydweb对依赖包版本要求过高,其他插件太久长没更新了,放弃!)

    2. spider-admin-pro

    2(1).安装spider-admin-pro
    pip3 install spider-admin-pro(根目录)
    2(2).启动服务
    Linux macOS 运行启动
    gunicorn 'spider_admin_pro.main:app'
    gunicorn --bind '0.0.0.0:8000' 'spider_admin_pro.main:app'

    windows 环境使用waitress 替换 gunicorn
    $ pip install waitress
    $ waitress-serve --listen=127.0.0.1:8000 'spider_admin_pro.main:app' (在scrapd的运行目录启动)
    waitress-serve --listen=172.50.4.161:6800 'spider_admin_pro.main:app'

    2(3).配置参数

    • v2.0版本移除了.env环境变量配置方式,仅支持yaml格式配置
    • v2.0版本移除了PORTHOST配置项,推荐统一采用gunicorn 管理

    在运行目录(根目录)下新建config.yml 文件,运行时会自动读取该配置文件

    强烈建议:修改密码和秘钥项

    eg:

    # 登录账号密码
    USERNAME: admin
    PASSWORD: "123456"
    JWT_KEY: "FU0qnuV4t8rr1pvg93NZL3DLn6sHrR1sCQqRzachbo0="
    
    # token过期时间,单位天
    EXPIRES: 7
    
    # scrapyd地址, 结尾不要加斜杆
    SCRAPYD_SERVER: "http://127.0.0.1:6800"
    
    # 日志文件夹
    LOG_DIR: 'logs'
    

    生成jwt key
    $ python -c 'import base64;import os;print(base64.b64encode(os.urandom(32)).decode())'

    3. Gerapy - git文档

    3(1).安装
    pip install Gerapy

     gerapy init
     cd gerapy
     gerapy migrate
     gerapy runserver
    

    四、 部署到服务器:

    xshell里面
    ctrl+c = ctrl + INS
    ctrl + v = shift + INS

    (一).链接Linux服务器、新建目录、上传并安装Python包

    [root@cscm-tth-app ~]# cd / #使用xshell连接后cd /到根目录
    [root@cscm-tth-app /]# ll # ll 等于ls等于dir 查看目录
    pwd 查看当前路径
    whereis python # 查看python安装目录
    新建文件夹: mkdir folderName
    修改文件名: mv oldname new
    修改权限(可读,写,执行): chmod 777 index.html

    1. 上传文件: rz 下载python3.11.4 上传到新建文件夹xmtSpider/下

    dpkg rpm yum apt 都是不同版本的Linux的包管理工具
    (类似iOS的cocoapods三方库管理工具)
    (类似node的npm)
    (类似Python的pip)

    如果没有安装rz,使用命令安装lrzsz:# yum -y install lrzsz
    覆盖上传 : rz -y
    上传出错:rz -e
    删除文件 : rm +文件名
    删除目录以及它所包含的所有内容 : rm -rf + 目录名
    下载文件 : sz
    下载dir目录下的所有文件,不包含dir下的文件夹:sz dir/*

    在开始安装python3之前,先要解决环境依赖问题,通过yum安装工具包,自动处理依赖关系,每个软件包通过空格分割提前安装好这些软件包,日后就不会出现很多坑

    . 正确安装: yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y

    2. 把下载好的包上传到xshell中,然后解压。
    tar -zxvf Python-3.11.4.tgz

    3. 编译安装,进入python文件夹(cd Python-3.11.4),执行命令进行编译
    ./configure --prefix=/usr/xmtSpider/python311 //默认安装在/usr/local下
    ./configure --prefix=/usr/local/python3 --with-openssl=/usr/local/openssl

    4. make #相当于把源码包里面的代码编译成linux服务器可以识别的代码
    make
    make install
    完成后可以 /usr/local/python3/bin/python3 -V查看安装的版本(这时候python -V还是老版本)

    5. 配置python3.11.4的环境变量
    查看PATH环境配置: echo $PATH (# 在目录Python-3.11.4下)

    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/xmtSpider/python311/bin:/root/bin:/usr/xmtSpider/python311/bin
    

    . 将python的所在目录配置到PATH里:
    export PATH=/usr/xmtSpider/python311/bin:$PATH (临时配置,,需要写入到文件,永久生效)

    建立软链接
    举例:
    当前目录是/local,而我经常要访问/usr/local/linux/work
    那么我就可以使用在local下建立一个文件linkwork,
    然后sudo ln -s /usr/local/linux/work /local/linkwork
    即建立两者之间的链接。

    # 查找
    ll /usr/bin/ |grep python
    ll /usr/bin/ |grep pip
     
    # 删除
    rm -rf /usr/bin/python  #先移除,不然会提示“链接已存在”
    rm -rf /usr/bin/pip
     
    # 重建
     #链接的目标文件可以登录xftp查看,一定要存在
    ln -s /usr/local/python3/bin/python3 /usr/bin/python 
    ln -s /usr/local/python3/bin//pip3 /usr/bin/pip
    
    验证:
    python -V
    pip --version
    

    此时python默认已经是3.11,但CentOS yum 还是依赖Python2.7,需要修改 yum 相关配置文件,确保yum 依然能够正常运行

    将/usr/bin/yum的顶部的:
    !/usr/bin/python  改成  !/usr/bin/python2.7 
    将/usr/libexec/urlgrabber-ext-down的顶部的:
    /usr/bin/python  改为   /usr/bin/python2.7
    将/usr/bin/yum-config-manager的顶部的
    !/usr/bin/python 改为 #!/usr/bin/python2.7
    

    linux有一个全局个人配置文件(这个未验证)
    vim /etc/profile
    编辑这个文件,在最底行写入PATH:PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/xmtSpider/python311/bin
    wq保存退出
    读一下这个/etc/profile 使得生效
    source /etc/profile

    把上面/etc/profile文件PATH只保留/usr/xmtSpider/python311/bin不知道行不行(已验证不行)

    6. 检查是否安装成功
    python -V

    whereis python # 查看python安装目录(这个没发现什么用处)

    /usr/xmtSpider/python311/bin/python3.11 
    /usr/xmtSpider/python311/bin/python3.11-config
    /usr/share/man/man1/python.1.gz
    

    【DEBUG】这里显示版本不是最新版本Linux中切换默认Python版本

    sudo update-alternatives --install /usr/bin/python python /usr/xmtSpider/python311/bin/python3.11 1 (##设置python311优先级为1)
    在服务器安装虚拟环境:

    python -m venv xmt-env
    source xmt-env/bin/activate  激活虚拟环境 
    ctrl + d 退出虚拟环境
    

    7.安装 scrapyd spider-admin-pro

    pip install -i https://pypi.tuna.tsinghua.edu.cn/simple spider-admin-pro
    gunicorn --bind '172.50.18.87:8000' 'spider_admin_pro.main:app'(default_scrapyd.conf修改bind0.0.0.0后,亲测可用)
    (我这里是进去虚拟环境就直接运行的代码,所以dbs,logs,eggs,config.yml这些目录和文件都是在根目录下)

    在虚拟环境下-启动scrapyd
    cd /xmtSpider/tutorial-env
    修改scrapyd配置文件 vim /xmt-env/lib/python3.11/site-packages/scrapyd/default_scrapyd.conf

    相关文章

      网友评论

          本文标题:Python scrapy全家桶

          本文链接:https://www.haomeiwen.com/subject/lalhudtx.html