Python scrapy全家桶

2023-07-27  本文已影响0人  sdupidBoby
python奇淫技巧:
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

上一篇下一篇

猜你喜欢

热点阅读