一、Scrapy框架的使用步骤:
- 创建项目:
scrapy startproject project_name
- 创建项目:
- cd进项目目录:
cd project_name
- cd进项目目录:
- 创建项目应用程序:
scrapy genspider app_name start_url
- 创建项目应用程序:
- 编写爬虫文件代码、settings配置:
codes........
- 编写爬虫文件代码、settings配置:
- 执行爬虫程序:
scrapy crawl app_name
- 执行爬虫程序:
二、Scrapy初始Url的两种写法:
- 一种是常量start_urls,并且需要定义一个方法parse()
import scrapy
class simpleUrl(scrapy.Spider):
name = "simpleUrl"
start_urls = [ #另外一种写法,无需定义start_requests方法
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
# 此方法名必须为:parse
def parse(self, response):
page = response.url.split("/")[-2]
filename = 'mingyan-%s.html' % page
with open(filename, 'wb') as f:
f.write(response.body)
self.log('保存文件: %s' % filename)
- 另一种是直接定义一个方法:star_requests()
import scrapy
class simpleUrl(scrapy.Spider):
name = "simpleUrl"
def start_requests(self):
urls = [
#爬取的链接由此方法通过下面链接爬取页面
'http://lab.scrapyd.cn/page/1/',
'http://lab.scrapyd.cn/page/2/',
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
三、Scrapy调试工具之scrapy shell使用方法:
调试就是验证scrapy到底有木有提取到数据的工具,如果木有它你根本不知道你写的规则到底有木有提取到数据,所以这个工具是个刚需!其实也很简单,就是在命令行输入下面一行代码而已:
scrapy shell start_url
:注意:执行此命令时需先cd到项目目录下
比如我们想提取http://lab.scrapyd.cn
的title
,我们可以在[s]:
后面输入:response.css('title')
,然后回车, 立马就得到如下结果:
似不似很直观的验证了你提取的数据对不对?如果正确了,我们再把上面的代码放到我们蜘蛛里面,那这样就会正确的得到你想要的数据,而不会出现意外了,这就是scrapy调试工具的应用!
四、Scrapy 爬取下一页,scrapy整站爬取
接下来,还是继续爬取:http://lab.scrapyd.cn (链接独白:为神马受伤的总是我?)!我们既然要爬取下一页,那我们首先要分析链接格式,找到下一页的链接,那爬取就简单了
主要代码实现
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)
五、Scrapy arguments:指定蜘蛛参数爬取
Using spider arguments,这个东西对于许多朋友来说,简直是雪中送炭,因为有了参数配置爬取,就能加大我们爬取的灵活性,而不必重复修改、编写爬虫代码了。
比如我们要爬取http://lab.scrapyd.cn里面的数据,原先我们需要全站的,过了几天需求变了,我们只需要:“人生”这个标签下面的内容,那我们又需要更改爬虫代码,又过了几天,需求又变,我们又需要标签:“励志”下面的内容,那我们又得改爬虫……
如果爬虫量少还好,那如果有十个、一百个……那一天到晚我们只能不断的修改、不断的伺候这些爬虫了!
那怎样才能让我们的爬虫更灵活呢?scrapy给我提供了可传参的爬虫,有了这么个功能,那人生就更加美丽了,上面不断变化的爬虫我们就可以这样来玩,首先按scrapy 参数格式定义好参数,如下:
import scrapy
class ArgsspiderSpider(scrapy.Spider):
name = "argsSpider"
def start_requests(self):
url = 'http://lab.scrapyd.cn/'
# 获取tag值,也就是爬取时传过来的参数
tag = getattr(self, 'tag', None)
# 判断是否存在tag,若存在,重新构造url
if tag is not None:
# 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
url = url + 'tag/' + tag
# 发送请求爬取参数内容
yield scrapy.Request(url, self.parse)
def parse(self, response):
mingyan = response.css('div.quote')
for v in mingyan:
text = v.css('.text::text').extract_first()
tags = v.css('.tags .tag::text').extract()
tags = ','.join(tags)
fileName = '%s-语录.txt' % tags
with open(fileName, "a+") as f:
f.write(text)
f.write('\n')
f.write('标签:' + tags)
f.write('\n-------\n')
f.close()
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)
代码写好之后,那我们要如何传参呢?如何运行呢?
比如我们要爬取标签:爱情,我们可以这样:
scrapy crawl argsSpider -a tag=爱情
要爬取标签:励志,我们可以这样:
scrapy crawl argsSpider -a tag=励志
参数:tag=爱情、tag=励志就可以在爬取的时候传进去我们蜘蛛里面,我们就可以不修改蜘蛛,愉快的爬取了!
六、scrapy命令明细:
1. Scrapy框架的命令也就十四五个,最常用的命令也就三个,即:
scrapy startproject(创建项目)、
scrapy crawl XX(运行XX蜘蛛)、
scrapy shell http://www.scrapyd.cn(调试网址为http://www.scrapyd.cn的网站)
2. scrapy命令分为:全局命令、项目命令;
很好理解,全局命令就是在哪都能用;项目命令就是只能依托你的项目
全局命令
- startproject:
创建项目
scrapy startproject(创建项目)
- genspider:
这个命令的话是根据爬虫模板创建爬虫py文件的命令
scrapy genspider spider_app_name start_url
- settings:
看字面意思,相信聪明的你已经知道它是干嘛的了!其实它就是方便你查看到你对你的scray设置了些神马参数!
比如我们想得到爬虫项目的下载延迟,我们可以使用:
scrapy settings --get DOWNLOAD_DELAY
比如我们想得到爬虫项目的名字:
scrapy settings --get BOT_NAME
- runspider:
这个命令有意思,之前我们运行爬虫项目除了使用:scrapy crawl XX
之外,我们还能用:runspider
,前者是基于项目运行,后者是基于文件运行,也就是说你按照scrapy的爬虫项目格式编写了一个py文件,那你不想创建项目,那你就可以使用runspider,比如你编写了一个:scrapyd_cn.py的爬虫文件,你要直接运行就是:
scrapy runspider scrapy_cn.py
- shell:
这个命令比较重要,主要是调试用
scrapy shell [http://www.scrapyd.cn](http://www.scrapyd.cn/)
- fetch:
这个命令其实也可以归结为调试命令的范畴!它的功效就是模拟我们的蜘蛛下载页面,也就是说用这个命令下载的页面就是我们蜘蛛运行时下载的页面,这样的好处就是能准确诊断出,我们的到的html结构到底是不是我们所看到的,然后能及时调整我们编写爬虫的策略!
scrapy fetch [http://www.scrapyd.cn](http://www.scrapyd.cn/)
- version:
查看scrapy版本
scrapy version
项目命令
- crawl:
运行爬虫文件
scrapy crawl my_project
- check:
检查爬虫文件
scrapy check my_project
- list:
显示有多少个爬虫文件
scrapy list
- edit:
编辑文件(类似于linux系统下的vim)
scrapy edit my_project
- parse
常用参数预览
scrapy parse my_project
- bench
项目详细运行情况
scrapy bench my_project