# -*- 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
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