这里介绍爬取下一页
爬取的内容为:
<div class="quote post"> <span class="text"> 各种时代,各国诗人,个抓个的痒。scrapy中文网(http://www.scrapyd.cn)整理 </span> <span> 作者:<small class="author">木心</small> <a href="http://lab.scrapyd.cn/archives/29.html">【详情】</a> </span> <p></p> <div class="tags"> 标签 : <a href="http://lab.scrapyd.cn/tag/木心/">木心</a> , <a href="http://lab.scrapyd.cn/tag/艺术/">艺术</a> </div> </div>
网页源码中下一页的链接如下:
<li class="next"> <a href="http://lab.scrapyd.cn/page/2/">下一页 »</a> </li>
爬取多页的源码:
# -*- coding: utf-8 -*- import scrapy, base64 proxy_user_pass = b"username:password" encoded_user_pass = base64.b64encode(proxy_user_pass) headers = { 'Proxy-Authorization': b'Basic ' + encoded_user_pass } metas = {'proxy': 'http://openproxy.xxxxxx.com:8080'} class muhe(scrapy.Spider): name = "mutian" #allowed_domains = ["lab.scrapyd.cn"] def start_requests(self): url = 'http://lab.scrapyd.cn/' yield scrapy.Request(url, self.parse, headers = headers, meta = metas) def parse(self, response): sblj = response.css('div.quote') # 提取首页所有名言,保存至变量mingyan for v in sblj: # 循环获取每一条名言里面的:名言内容、作者、标签 text = v.css('.text::text').extract_first() # 提取名言 autor = v.css('.author::text').extract_first() # 提取作者 tags = v.css('.tags .tag::text').extract() # 提取标签 tags = ','.join(tags) # 数组转换为字符串: #接下来进行写文件操作,每个名人的名言储存在一个txt文档里面 fileName = '%s-语录.txt' % autor # 定义文件名,如:木心-语录.txt with open(fileName, "a+") as f: # 不同人的名言保存在不同的txt文档,“a+”以追加的形式 f.write(text) f.write('\n') # ‘\n’ 表示换行 f.write('标签:' + tags) f.write('\n-------\n') f.close() # 接下来我们需要判断下一页是否存在,如果存在 # 我们需要继续提交给parse执行关键看 scrapy 如何实现链接提交 next_page = response.css('li.next a::attr(href)').extract_first() # css选择器提取下一页链接 if next_page is not None: # 判断是否存在下一页 #如果是相对路径,如:/page/1 urljoin能替我们转换为绝对路径,也就是加上我们的域名 #最终next_page为:http://lab.scrapyd.cn/page/2/ next_page = response.urljoin(next_page) """ scrapy给我们提供了这么一个方法:scrapy.Request() 我们要把链接提交给哪一个函数(callback=self.parse)爬取,这里是parse函数,也就是本函数 当然,我们也可以在下面另写一个函数,比如:内容页,专门处理内容页的数据 经过这么一个函数,下一页链接又提交给了parse,那就可以不断的爬取了,直到不存在下一页 """ yield scrapy.Request(next_page, callback=self.parse, headers = headers, meta = metas)
参考网址:http://www.scrapyd.cn/doc/160.html
scrapy arguments:指定蜘蛛参数爬取
# -*- coding: utf-8 -*- import scrapy class ArgsspiderSpider(scrapy.Spider): name = "argsSpider" def start_requests(self): url = 'http://lab.scrapyd.cn/' tag = getattr(self, 'tag', None) # 获取tag值,也就是爬取时传过来的参数 if tag is not None: # 判断是否存在tag,若存在,重新构造url url = url + 'tag/' + tag # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/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=励志
参考网址: http://www.scrapyd.cn/doc/165.html