伯乐在线
# -*- 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):
# 找到文章详情地址,图片链接
ps = response.xpath('//p[@class="post floated-thumb"]//p[@class="post-thumb"]')
# for循环遍历
for p in ps:
href = p.xpath('a/@href').extract_first('')
img_src = p.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('//p[@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('//p[@class="entry"]/p//text()').extract()
content = '\n'.join(content)
# 点赞
digg_num = response.xpath('//h10/text()').extract_first('0')
# 收藏
bookmark = response.xpath('//p[@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('//p[@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
相关阅读
效果预览预览链接:https://icv2qn.axshare.com一、交互逻辑分析(1)两种度量制间的切换:公制(千克、厘米);英制(磅、英寸)【注意后面的单位
如果你是一间公司的领导,那么你一定很清楚开源节流的重要性。执行企业核心能力固然是你业务成功的关键因素,但另一个关键是有效地营
2015年成立、有着“2017年度品牌影响力教育机构”称谓的学霸1对1,已经于2018年10月8日正式停止服务。一夜之间,从前人们
在如今移动互联网盛行的时代,PC端网站还有做的意义吗?首先企业网站是一个企业的网上品牌形象,做生意就要选好的“门面”,网
黑客教你3分钟盗微信号(微信密码在线破解器)【黑/客/徽/信/10484866】专业盗取微信密码,开房查询,通话记录查询,查询微信记录。其