Python scrapy全家桶
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版本移除了
PORT
和HOST
配置项,推荐统一采用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