1.创建爬虫项目:
scrapy startproject kgcs(项目名)
2.创建蜘蛛:
cd kgcs(到此目录下)
scrapy gensqiber kgcsSpider(蜘蛛名) www.baidu.com(爬取的网址)
3.创建json文件(在蜘蛛目录下)
scrapy runspider kgcsSpider.py (蜘蛛文件名)-o kgc.json(创建) -s FEED_EXPORT_ENCODING=utf-8
4.运行蜘蛛(在项目目录下)
scrapy crawl kgcsSpider(蜘蛛名)
常用CSS选择器方法
- 选中所有的E元素,直接元素名
>>>response.css('img')
- 选中E1和E2元素,使用‘,’逗号
>>>response.css('E1,E2')
- 选中E1后代元素中的E2元素,使用空格
>>>response.css('E1 E2')
- 选中E1志愿书中的E2元素,使用‘>’符号
>>>response.css('E1>E2')
- 选中包含ATTR属性的元素,使用‘[]’符号
>>>response.css('[attr]')
- 选中包含ATTR属性且值为VALUE的元素,使用‘[attr=value]’符号
>>>response.css('[attr=value]')
- 选中E元素,且该元素必须是其父元素的第n个子元素,使用‘E:nth-child(n)’
>>>response.css('E:nth-child(n)')
- 选中E的第一个子元素,使用‘E:first-child’
- 选中E的最后一个子元素,使用‘E:last-child’
- 选中E元素的文本节点,使用‘E::text’
*实例spider蜘蛛
import scrapy
from kgcs.items import *
class KgcsspiderSpider(scrapy.Spider):
#:蜘蛛名
name = 'kgcss'
#:控制访问的的范围
#allowed_domains = ['kgc.cn']
#:访问的网站
start_urls = ["http://www.kgc.cn/list/230-1-6-9-9-0.shtml",]
#:继承的重写parse方法,通过响应得到数据
def parse(self, response):
#css,xpath
#extract()和extract_first()区别
#返回数组,返回字符串
title=response.css("li.course_detail a.yui3-u.course-title-a.ellipsis::text").extract()
propertys=response.css("span.course-pepo::text").extract()
qian=response.css("div.right.align-right>span::text").extract()
image_urls=response.css("a.kgc-w>img::attr('src')").extract()
#用zip()打包数组000,111,222
infos=zip(title,propertys,qian,image_urls)
#循环每一层zip添加到item类中(类似map)item事先定义好了key
for i in infos:
item=KgcsItem()
item["title"]=i[0]
item["propertys"]=i[1]
item["qian"]=i[2]
item["image_urls"]=[i[3]]
yield item
next_page=response.css("li.next a::attr('href')").extract_first()
#寻找下一个网页使用follow()重新调用item
if next_page is not None:
yield response.follow(next_page,self.parse)
item(“定义结构化数据”)
import scrapy
class KgcsItem(scrapy.Item):
# define the fields for your item here like:
#为项目定义字段
# name = scrapy.Field()
#在item定义字段在蜘蛛里面给值
title=scrapy.Field()
propertys=scrapy.Field()
qian=scrapy.Field()
#图片路径
image_urls=scrapy.Field()
#通过路径下载的图片信息[{字典},{字典}]
images=scrapy.Field()
#images信息
# [{'checksum': '7e46b2ba51f1bd25c741429355dc9eb3',
# 'path': 'full/9d192da26d42270e930217c28278995714e26e71.jpg',
# 'url': 'http://assets.kgc.cn//upload/open/20171020/1508488872993478_thumb.jpg'}]
pipelines(管道)
class KgcsPipeline(object):
#蜘蛛开启运行创建文件
def open_spider(self,spider):
self.file=open("kgc.csv","w",encoding="UTF-8")
#蜘蛛关闭运行关闭流
def close_spider(self,spider):
self.file.close()
#每次yeild tiem运行一次填写文件内容
def process_item(self, item, spider):
line=item["title"]+"---"+item["propertys"]+"---"+item["qian"]+"\n"
self.file.write(line)
return item
settngs(配置文件)
#设置访问 #如果启用,Scrapy将会采用 robots.txt策略
ROBOTSTXT_OBEY = True
#管道配置
ITEM_PIPELINES = {
'kgcs.pipelines.KgcsPipeline': 300,
#启动图片下载
'scrapy.pipelines.images.ImagesPipeline': 1,
}
#图片的下载目录
IMAGES_STORE = '/home/chenfeng/d_image'
start(运行命令文件)
from scrapy.cmdline import execute
#运行命令文件
if __name__=="__main__":
execute("scrapy crawl kgcss".split())
爬虫项目目录结构
items.py 负责数据模型的建立,类似于实体类。
middlewares.py 自己定义的中间件。
pipelines.py 负责对spider返回数据的处理。
settings.py 负责对整个爬虫的配置。
spiders目录 负责存放继承自scrapy的爬虫类。
scrapy.cfg scrapy基础配置
承载数据:item
请求对象:request
响应对象:response
引擎: engine
蜘蛛: spider
管道: pipeline
中间件:middleware
调度器:scheduler
1.引擎启动加载中间件
2,启动蜘蛛 请求引擎 交给 调度器排队 给下载器 返回响应 到蜘蛛返回item item如果是请求 在给调度器 下载