未安装 Scrapy 框架,见上一篇文章:框架安装及配置
一、 通过命令构建一个爬虫项目
注:SinanewsSpider 为项目名
scrapy startproject SinanewsSpider
成功创建后的目录如下:
这些文件主要是:
scrapy.cfg: 项目配置文件
SinanewsSpider/: 项目python模块, 代码将从这里导入
SinanewsSpider/items.py: 项目items文件
SinanewsSpider/pipelines.py: 项目管道文件
SinanewsSpider/settings.py: 项目配置文件
SinanewsSpider/spiders: 放置spider的目录
二、定义 item
编辑 settings.py 文件,定义两个数据存放的容器( items 是将要装载抓取的数据的容器 )
# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class SinanewsspiderItem(scrapy.Item): #定义数据项类,从scrapy.Item继承
# define the fields for your item here like:
# name = scrapy.Field()
addr = scrapy.Field()
name = scrapy.Field()
pass
三、激活 pipeline 管道
编辑 settings.py 文件,添加如下代码:
BOT_NAME = 'SinanewsSpider'
SPIDER_MODULES = ['SinanewsSpider.spiders']
NEWSPIDER_MODULE = 'SinanewsSpider.spiders'
ROBOTSTXT_OBEY = True
ITEM_PIPELINES = {
'SinanewsSpider.pipelines.SinanewsspiderPipeline': 300,
}
四、编写爬虫 Spider
新建 SinanewsSpider.py 文件,Scrapy 框架已经帮助我们定义好了基础爬虫,只需要从 scrapy.spider 继承,并重写相应的解析函数 parse 即可。
注:案例使用的网站是 www.xiaohuar.com
# -*- coding: utf-8 -*-
# 导入爬虫框架
import scrapy
# 导入item中结构化数据模板
from SinanewsSpider.items import SinanewsspiderItem
import urllib.request
import time
import win32api,win32con
import os
class SinanewsSpider(scrapy.Spider):
# 爬虫名称,唯一
name = 'SinanewsSpider'
# 允许访问的域
allowed_domains = ['xiaohuar.com']
# 初始URL
start_urls = [
'http://www.xiaohuar.com/2014.html'
]
def parse(self, response):
# 获取所有图片的a标签
allPics = response.xpath('//div[@class="img"]/a')
# 判断文件是否存在
if not os.path.exists(get_desktop() + '\\TP'):
os.mkdir(get_desktop() + '\\TP')
for pic in allPics:
# 分别处理每个图片,取出名称及地址
item = SinanewsspiderItem()
name = pic.xpath('./img/@alt').extract()
# 没有这个属性就不取值
if name.__len__() != 0:
name = name[0]
addr = pic.xpath('./img/@src').extract()
# 没有这个属性就不取值
if addr.__len__() != 0:
addr = addr[0]
# 没有前缀加前缀
if 'http://www.xiaohuar.com' not in addr:
addr = 'http://www.xiaohuar.com' + addr
# 将数据存入到数据项
item['name'] = name
item['addr'] = addr
# 下载并保存到桌面的TP文件夹中
urllib.request.urlretrieve(addr, get_desktop() + "\\TP\\" + str(round(time.time() * 1000)) + '.jpg')
print(addr, "下载成功")
# 返回爬取到的数据
yield item
# 获得桌面路径
def get_desktop():
key =win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders',0,win32con.KEY_READ)
return win32api.RegQueryValueEx(key,'Desktop')[0]
五、运行爬虫
scrapy crawl SinanewsSpider