伯乐在线

# -*- coding: utf-8 -*-
import scrapy
import re
from ..items import ArticleItem
class BoleSpider(scrapy.Spider):
    name = 'bole'
    allowed_domains = ['jobbole.com']
    start_urls = ['http://blog.jobbole.com/all-posts/']
    base_url = 'http://blog.jobbole.com/all-posts/'
    def parse(self, response):


        # 找到文章详情地址,图片链接
        divs  = response.xpath('//div[@class="post floated-thumb"]//div[@class="post-thumb"]')
        # for循环遍历
        for div in divs:
            href = div.xpath('a/@href').extract_first('')
            img_src = div.xpath('a/img/@src').extract_first('')
            print(href,img_src)
            # 创建请求对象,yield请求
            yield scrapy.Request(
                url=href,
                meta={'img_src':img_src},
                callback=self.parse_detail
            )


        # 1.直接找下一页标签
        # 2.没有下一页标签,再去找总页数,没有总页数,找总个数,计算总页数,注意向上取整
        # 找到所有的a标签
        # 返回的是一个列表
        all_a = response.xpath('//a[@class="page-numbers"]')
        # 取出最后一个
        total_a = all_a[-1]
        # 拿到的是一个字符串
        pages = total_a.xpath('text()').extract_first('')
        # for循环遍历
        # scrapy自带的有去重策略,当一个url请求被发送过之后,如果再次对这个地址发送请求,scrapy默认会去除这个重复request,这次请求不会被发送
        for x in range(2,10):
            # 根据x的值拼接完整的url地址,发请请求
            url = self.base_url+'page'+'/'+str(x)+'/'
            # yield一个请求
            yield scrapy.Request(
                url=url,
                callback=self.parse
            )
    def parse_detail(self, response):


        # 文章标题
        title = response.xpath('//h1/text()').extract_first('')
        # 找到日期和标签文本内容
        res = response.xpath('//div[@class="entry-meta"]/p//text()').extract()
        # 拼接完整的字符串
        string = ''.join(res)
        # 去除\n\r 空格
        pattern =re.compile('\r|\n| ',re.S)
        string = re.sub(pattern,'',string)
        rs_list = string.split('·')
        # 取出日期
        date = rs_list.pop(0)
        # 标签
        tags = ','.join(rs_list)
        # 文章内容
        content = response.xpath('//div[@class="entry"]/p//text()').extract()
        content = '\n'.join(content)
        # 点赞
        digg_num = response.xpath('//h10/text()').extract_first('0')
        # 收藏
        bookmark = response.xpath('//div[@class="post-adds"]/span[2]/text()').extract_first('')
        # 判断是否有收藏数
        pattern = re.compile('\d+')
        res = re.search(pattern,bookmark)
        # 是否有结果
        if res:
            bookmark = res.group()
        else:
            bookmark = '0'
        # 评论数
        comment = response.xpath('//div[@class="post-adds"]/a/span/text()').extract_first('')
        pattern = re.compile('\d+')
        res = re.search(pattern,comment)
        if res:
            comment = res.group()
        else:
            comment  = '0'


        # 封面图
        img_src = response.meta.get('img_src')


        item = ArticleItem()
        item['title'] = title
        item['date'] = date
        item['tags'] = tags
        item['content'] = content
        item['digg_num'] = digg_num
        item['bookmark'] = bookmark
        item['comment'] = comment
        item['img_src'] = [img_src]
        # 把图片下载之后存储的路径保存起来
        # images/1-self-management-1024x640.jpg
        # item['img_path'] 这里还没下载图片,无法保存图片存储路径


        # 把item交给pipeline处理
        yield item
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值