1 创建项目:
```
$ scrapy startproject project_name
```
2 创建蜘蛛
```
在spiders文件夹下,创建一个文件,my_spiders.py
```
3 写蜘蛛:
```
my_spiders.py 文件下
1 创建类,继承scrapy的一个子类
2 定义一个蜘蛛名字, name = "you name"
3 定义我们要爬取的网址
4 继承scrapy的方法:start_requests(self
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
# 1 创建类,继承scrapy的一个子类
class mingyan(scrapy.Spider):
# 2 定义一个蜘蛛名字, name = "you name",项目中 必须是唯一的
name = "mingyan"
# 4 继承scrapy的方法:start_requests(self),必须返回请求列表或者生成器函数.,后续请求姜葱这些初始请求中连续生成.
def start_requests(self):
# 3 定义我们要爬取的网址
urls = [
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
for url in urls:
# 爬取到的页面如何处理?提交给parse方法处理
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
'''
20
start_requests已经爬取到页面,那如何提取我们想要的内容呢?那就可以在这个方法里面定义。,响应参数是TextResponse保存页面内容的实例.
1、定义链接;
24
2、通过链接爬取(下载)页面;
25
3、定义规则,然后提取数据;
26
就是这么个流程,似不似很简单呀?
27
'''
# 根据上面的链接提取分页,如:/page/1/,提取到的就是:1
page = response.url.split('/')[-2]
# 拼接文件名,如果是第一页,最终文件名便是:mingyan-1.html
filename = 'mingyan-%s.html' % page
with open(filename, 'wb') as f:
# 刚才下载的页面去哪里了?response.body就代表了刚才下载的页面!
f.write(response.body)
# 打个日志
self.log("保存文件:%s" % filename)
------------------------------简化版本-------------------------
import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor
# 1 创建类,继承scrapy的一个子类
class mingyan(scrapy.Spider):
# 2 定义一个蜘蛛名字, name = "you name",项目中 必须是唯一的
name = "mingyan"
# 4 简化版本,采用start_urls,但是必须定义parse方法,parse方法是scrapy的默认回调方法.
start_urls = [
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
def parse(self, response):
# 根据上面的链接提取分页,如:/page/1/,提取到的就是:1
page = response.url.split('/')[-2]
# 拼接文件名,如果是第一页,最终文件名便是:mingyan-1.html
filename = 'mingyan-%s.html' % page
with open(filename, 'wb') as f:
# 刚才下载的页面去哪里了?response.body就代表了刚才下载的页面!
f.write(response.body)
```
5 运行蜘蛛:
```
#项目顶级目录下面.
$scrapy crawl mingyan
```
第二部分:调试工具学习数据提取.
1 进入调试工具:输入命令之后,就已经进行了请求,已经获取到了首页的内容.数据保存在response对象中.
```
scrapy shell 'url'
当从命令行运行Scrapy shell时,请记住始终将URL括在引号中,否则包含参数(即&字符)的url 将不起作用。
在Windows上,请使用双引号:
例如:
$ scrapy shell "http://http://lab.scrapyd.cn/"
```
2 后面就可以进行调试验证:
```
提取方法1 css-----------------------------------
>>>response.css("title") #结果得到一个类似列表的对象selectorList,包含xml/html元素对象里列表,可以进一步查询和提取数据.
[<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]
>>>response.css("title::text").extract() #从结果集中提取文本,::text意味着直接在元素内选择文本元素<title>里的内容,不包含标签.
['Quotes to Scrape']
>>>response.css("title").extract() #如果不指定::text,那么将获得完整的title元素,包括标签.
>>>response.css("title::text").extract_first() #提取结果集中的第一个元素,extract()提取的是一个列表.extract_first()可以避免IndexError和返回None.
'<title>Quotes to Scrape</title>'
>>>response.css("title::text").re(r"Quotes.*") #也可以用正则表达式的方法提取
['Quotes to Scrape']
>>>response.css("title:;text").re(r"(\w+)to(\w+)')
['Quotes', 'Scrape']
提取方法2 XPath------------------------------------------
>>>response.xpath("//title")
[<Selector xpath='//title' data='<title>Quotes to Scrape</title>'>]
>>>response.xpath("//title/text()").extract_first()
'Quotes to Scrape'
```
第三部分自动进行爬取:
1 编写解析方法,自动解析数据:
```
def parse(self):
mingyan_list = response.css("div.quote")
next_page = response.css("li.next a ::attr(href)").extract_first()
if next_page is not None:
next_page = response.urljoin(next_page)
yield scrapy.Request(next_page,callback=self.parse)
for mingyan in mingyan_list:
text = mingyan.css('.text::text').extract_first() #提取名言
author = mingyan.css('.author::text').extract_first() #提取作者
tags = mingyan.css('.tags .tag::text').extract() #提取标签
tags = ','.join(tags)
fileName = '%s-语录.txt' % author #爬取内容存入文件,文件名为作者-语录.txt
f=open(fileName,'a+') #追加写入文件
f.write(text) #写入名言内容
f.write('\n') #换行
f.write('标签'+tags) #写入标签
f.close()
```
2 方法介绍:
```
1 response.urljoin(url)
这个方法获取网页绝对地址,就是将页面中的相对地址和页面拼接,构建完整的绝对URL
2 scrapy.request(url,callback=function)
这个函数用来请求页面,也就是爬取数据.
3 css选择器,支持attr,
>>> response.css('li.next a::attr(href)').extract_first()
'/page/2/'
4 创建请求的快捷方式:
response.follow(url,callback=self.parse)#这个url可以使相对url,也就是不用调用urljoin方法,其返回的是一个Request实例,仍然要yield
url也可以是选择器.
for href in response.css('li.next a::attr(href)'):
yield response.follow(href, callback=self.parse)
对于<a>元素的连接,有一个快捷方式.自动调用其href属性.必须是一个a元素,也就是通过循环,或者下标获取a.
for a in response.css('li.next a'):
yield response.follow(a, callback=self.parse)
```
3 存储已经删除的数据:
最简单的方法是使用Feed导出,json格式.由于历史原因,Scrapy会附加到给定文件而不是覆盖其内容。如果在第二次之前没有删除文件的情况下运行此命令两次,则最终会出现损坏的JSON文件。
```
scrapy crawl 爬虫名 -o 文件名.json(要生成文件的名字,并一json序列化),-o指定生成文件.
$ scrapy crawl quotes -o quotes.json
```
第二种方法,json Lines格式,该[JSON行](http://jsonlines.org/)格式是有用的,因为它的流状,你可以很容易地新记录追加到它。当你运行两次时,它没有相同的JSON问题。此外,由于每条记录都是一个单独的行,您可以处理大文件而无需将所有内容都放在内存中,有些工具如[JQ](https://stedolan.github.io/jq)可以帮助您在命令行中执行此操作。
```
scrapy crawl 爬虫名 -o 文件名.jl(要生成文件的名字,并一json序列化)
$ scrapy crawl quotes -o quotes.jl
```
如果要使用已删除的项目执行更复杂的操作,可以编写[项目管道](https://docs.scrapy.org/en/latest/topics/item-pipeline.html#topics-item-pipeline)。项目管道的占位符文件已在创建项目时为您设置`tutorial/pipelines.py`。
第四部分:可传参爬虫.
1 爬虫编写
```
import scrapy
class MingYan(scrapy.Spider):
name = "MingYan"
def start_requests(self):
url = "http://lab.scrapyd.cn/"
#获取tag,tag是命令行传过来的参数
tag = getattr(self,'tag',None)
if tag is not None:
url = url+'tag/' +tag
yield scrapy.Request(url,self.parse)
def parse(self,response):
....
```
2 使用:
```
$scrapy crawl MingYan -a tag=爱情 #tag将值传递过去. -a指定tag
```
第五部分,scrapy命令:
```
常用命令:
scrapy startproject(创建项目)、
scrapy crawl XX(运行XX蜘蛛)、
scrapy shell http://www.scrapyd.cn(调试网址为http://www.scrapyd.cn的网站)
全局命令:
01
startproject
scrapy startproject myproject [project_dir]
在project_dir目录下创建一个Scrapy项目。如果project_dir没有指定,project_dir将是相同的myproject。
02
03
genspider 根据蜘蛛模板创建蜘蛛的命令
scrapy genspider mydomain mydomain.com
04
05
settings 它就是方便你查看到你对你的scray设置了些神马参数
获取当前的配置信息
通过scrapy settings -h可以获取这个命令的所有帮助信息
06
07
runspider 运行蜘蛛除了使用:scrapy crawl XX之外,我们还能用:runspider,前者是基于项目运行,后者是基于文件运行,也就是说你按照scrapy的蜘蛛格式编写了一个py文件,那你不想创建项目,那你就可以使用runspider,比如你编写了一个:scrapyd_cn.py的蜘蛛,你要直接运行就是:
查看源码打印代码帮助
1
scrapy runspider scrapy_cn.py
08
09
shell
10
11
fetch 它的功效就是模拟我们的蜘蛛下载页面, scrapy fetch http://www.scrapyd.cn
如果你要把它下载的页面保存到一个html文件中进行分析,我们可以使用window或者linux的输出命令,这里演示window下如下如何把下载的页面保存:
查看源码打印代码帮助
该命令会通过scrapy downloader 讲网页的源代码下载下来并显示出来
这里有一些参数:
--nolog 不打印日志
--headers 打印响应头信息
--no-redirect 不做跳转
1
scrapy fetch http://www.scrapyd.cn >d:/3.html
12
13
view fetch类似都是查看蜘蛛看到的是否和你看到的一致,便于排错,用法:
scrapy view url地址
该命令会讲网页document内容下载下来,并且在浏览器显示出来
14
15
version
```
```
scrpay项目命令
crawl 运行蜘蛛
check 检查蜘蛛
list 显示有多少个蜘蛛
edit
parse
bench
```