前言:很久之前就在b站上看过一些博主的scrapy视频,不过最近找的时候下架了…(难受.png)…不过凭着还有一点印象,再加上无所不能的百度。还是整出了个流程。这里记录一下。(windows下)
一、安装scrapy pip install scrapy
详细的我这里就不讲了,网上很多要看的可以去找一下。
二、因为我之前已经安装好了,所以直接进入主题。
1.创建项目,这次我要捉取的数据是一个ip网站的ip,网站用www.ip.com代替
cmd进入我们scrapy安装目录下。scrapy startproject getip
然后cd getip
进入getip,再scrapy genspider -t crawl ip ip.com
这样我们就创建好了这个项目
2.然后我们进入到 cd getip cd getip
下的 ip.py
文件
这个原始页面上name不用理他,然后allowed_domains是允许是域名,start_urls是开始的url 我们把他设置成第一页面的url http://www.ip.com/?page=1
然后再下面rules是一个规则,allow是允许匹配链接的模式,我们可以利用这个规则去提取他的下一页 我这里写成 .+ip.com/\?page=\d
这样他就可以在当前页面找到符合规则的其他页面的url。callback是回调函数,就是响应后去操作的方法。follow是否允许当前页面匹配生成新的url 这里True是允许。
3.这样我们就可以去执行这个项目了 执行项目的话 在根目录下创建一个start.py
文件
#encoding:utf-8
from scrapy import cmdline
cmdline.execute("scrapy crawl ip".split()) # ip是主文件的名字
然后执行这个文件,他会报错404 我们需要去找settings.py 修改他里面的机器人协议
# Obey robots.txt rules
ROBOTSTXT_OBEY = True # 把True修改成False
settings.py文件里面还有常用的地方要修改的几个地方,这里也一并指出,
# 1 ITEM_PIPELINES :这个注释的话,会无限访问。容易被识别成机器人。所以要取消注释,一般设置1到2秒
DOWNLOAD_DELAY = 2
# 2 这个是启用一个item_pipelines组件,让item的数据可以传到pipelines管道
ITEM_PIPELINES = {
'getip.pipelines.GetipPipeline': 300,
}
# 3 DEFAULT_REQUEST_HEADERS:设置请求头部基本信息
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
}
再次运行start.py
就可以看到页面信息了 接下来就是提取页面信息了。
4.然后我们用xpath提取 ip、端口、协议
他网站一页面只有10条,从这里我们可以看到他已经把多页数据提取出来了。
三、把他传到管道中保存
1 我们去到items.py
文件定义我们要提取的参数。
把这三个我们要的参数放进去 。
2. 然后在ip.py
中引入这个类 from getip.items import GetipItem
3. 最后我们回到ip.py
文件 把循环出来的ip信息用yield
传到pipelines.py
里面去永久化
然后去到pipelines.py
文件里面打印出item
看看他是不是我们要的数据
我们可以看到我们想要的数据已经到了这里。接下来就是存储到数据库了
四、永久化到数据库
1.先给数据库建一个表,表名proxy_info
他包含有主键(id),ip(ip),端口(port),协议(https)
# 创建一个数据库
create database xiaolanlan;
#选择数据库
use xiaolanlan;
#创建表
create table if not exists `proxy_info`(
`id` int unsigned auto_increment,
`ip` varchar(20) not null,
`port` int(8) not null,
`http` varchar(20) not null,
primary key (`id`)
)engine=Innodb default charset=utf8;
2然后用pymysql
把数据存到数据库中
3.接下来我们看一眼数据库有没有保存有数据
可以看到数据已经存到数据库了。
PS:暂时写到这里,刚开始看scrapy,如果有错误请提醒一下,谢谢。