目录
前言
你好,我是Dr.叶子,用心写最优美的博客,弹最好听的钢琴!
项目背景
- 之前写了篇简版的作为入门,链接: Python爬虫实战之:快代理搭建IP代理池(简版)。为了进一步提升自己的能力,整理了这篇Scrapy进阶版。
- 网上的一些知识太过于零散,项目代码不规范,所以亲自搭建实战项目,与大家分享!
项目简介
本项目主要基于Scrapy框架搭建爬虫,爬取快代理网站的IP数据,经过有效性验证后,储存到PostgreSQL,形成IP代理池,方便以后开展更多的爬虫项目,能防止个人IP被封锁。
前期准备
- 操作系统:Windows 8.1;
- 语言版本:Python 3.7;
- 开发工具:Pycharm 2.1 专业版;
- 数据库:PostgresSQL 最新版;
- Scrapy框架:1.5.1 版本;
- requests 库:发起请求;
- faker 库:自动随机生成 user-agent;
- psycopg2 库:连接PostgresSQL 用;
讲解1:项目搭建
1. Scrapy的安装: 打开 Pycharm 的 Terminal 命令终端执行
# 方法1:直接安装
pip install scrapy
# 方法2:若连接超时,则切换国内镜像
pip install scrapy -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
Terminal 命令终端随便一个目录下都行,只要你的 Python 环境配置了系统环境变量。最好还是cd到你要存放项目的文件夹下吧,方便后面操作!
2. 新建一个工程: 打开 Pycharm 的 Terminal 命令终端
# cd 进入到你要存放该工程的目录,然后执行下面命令
scrapy startproject proxy
proxy: 工程名称;
3. 构建爬虫spider: cd 进入该工程目录下执行
scrapy genspider kuaidaili www.kuaidaili.com
kuaidaili: 爬虫名称;
www.kuaidaili.com: 爬虫的域名(按代码写的为准,图片是旧的截图);
一个工程中可以存在多个spider爬虫, 但是名字必须唯一
4. 进入工程: Pycharm打开项目,进入到proxy工程
5.查看工程结构
proxy
├── proxy
│ ├── __init__.py
│ ├── items.py # Items的定义,定义抓取的数据结构
│ ├── middlewares.py # 定义Spider和DownLoader的Middlewares中间件实现。
│ ├── pipelines.py # 它定义Item Pipeline的实现,即定义数据管道
│ ├── settings.py # 它定义项目的全局配置
│ └── spiders # 其中包含一个个Spider的实现,每个Spider都有一个文件
│ ├── __init__.py
│ └── kuaidaili.py # 爬虫文件
└── scrapy.cfg #Scrapy部署时的配置文件,定义了配置文件路径、部署相关信息等内容
到这里,一个Scrapy爬虫项目的基础架构初现,接下来就是完成业务逻辑,实现爬数据、存数据的功能。
讲解2:理解Scrapy框架
1. 数据流图: 来自官网
具体处理步骤,请参阅: Scrapy 官方文档
2. Scrapy 组件介绍:
Scrapy Engine(Scrapy引擎)
引擎负责控制所有组件之间的数据流 系统,并在发生某些操作时触发事件(框架核心)。Scheduler(调度程序)
接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回。Downloader(下载器)
下载网页内容, 并将网页内容返回给爬虫程序Spiders(爬虫)
爬虫是用户编写的自定义类,用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。可以从中提取出链接,让Scrapy继续抓取下一个页面。Item 项目
定义爬取结果的数据结构,爬取的数据会赋值成改Item对象。Pipeline(项目管道)
负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。Downloader Middlewares(下载器中间件)
位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。Spider Middlewares(爬虫中间件)
介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。Scheduler Middewares(调度中间件)
介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。
讲解3:Python连接PostgresSQL
1. 安装 psycopg2 库: 连接postgres数据库必须的库
# 用豆瓣等国内镜像加速下载
pip install psycopg2 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
2. 初步使用:
# 步骤1:定义数据库连接参数
database = "proxy"
user = "postgres"
password = "123456"
host = "localhost"
port = "5432"
# 步骤2:连接数据库
db = psycopg2.connect(database=database, user=user,
password=password, host=host, port=port)
# 步骤3:开启游标
cur = self.db.cursor()
# 步骤4:利用游标执行数据库的“增、删、查、改”
... ...
# 步骤5:最后记得关闭数据库的连接和游标
db.close()
cur.close()
在项目中的具体使用,请看后面讲解和代码~
讲解4:创建IP代理池数据库
-- 建表
CREATE TABLE if not exists proxy
(
id SERIAL PRIMARY KEY,
ip varchar(15),
port varchar(6),
degree varchar(10),
type varchar(10),
position varchar(128),
operator varchar(6),
speed float(53),
last_time timestamp
);
-- 表注释
COMMENT ON TABLE proxy IS '代理池表';
--