scrapy 爬取多页和参数


这里介绍爬取下一页

 

爬取的内容为:

<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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM