一、总体思路:
1、下载start_urls,交给parse方法处理,文章列表页start_urls = ['http://blog.jobbole.com/all-posts/']
2、parse处理,从中获取本页的文章url(以后获取到文章首图传递个自定义的parse_detail),和下一页的url
3、将下一页的url交给parse方法。继续进行1和2;将文章url传递给自定义的解析函数parse_detail
4、parse方法对下一页的url进行下载,自定义的parse_detial则通过css或者xpath 解析有用的信息传递给Item,次数两个操作是异步操作
二、进行两步操作:
1、从页面抓取所有的文章url交给解析器进行解析这个页面的标题时间点赞数等
2、从页面抓取下一个页面的url 进行下载
以上两部是异步进行的,什么叫异步。就是小明一边在吃冰棍,一边在看电视,懂了吗?
>>> response.css("#archive .floated-thumb .post-thumb a::attr(href)").extract() ['http://blog.jobbole.com/111366/', 'http://blog.jobbole.com/111363/', 'http://blog.jobbole.com/111360/', 'http://blog.jobbole.com/111318/', 'http://blog.jobbole.com/108614/', 'http://blog.jobbole.com/111231/', 'http://blog.jobbole.com/111334/', 'http://blog.jobbole.com/111317/', 'http://blog.jobbole.com/111322/', 'http://blog.jobbole.com/111293/', 'http://blog.jobbole.com/111319/', 'http://blog.jobbole.com/111312/', 'http://blog.jobbole.com/102337/', 'http://blog.jobbole.com/111291/', 'http://blog.jobbole.com/111189/', 'http://blog.jobbole.com/111269/', 'http://blog.jobbole.com/111268/', 'http://blog.jobbole.com/111276/', 'http://blog.jobbole.com/111261/', 'http://blog.jobbole.com/111249/']
这样顺利的把列表页的href都提取出来啦!
tips:别忘了,在导入库上面要加入:from scrapy.http import Request# 从scrap上让Request工具帮忙进行下载
#从网页提取文章的URL,交给scrapy下载,并传递给parse_detail解析
#不是完整的地址,urljoin有两个参数,主域名自动拼接不完整的域名,并from urllib import parseyield 拼拼接过程:Request ( url=parse.urljoin ( response.url, post_url ), callback=self.parse_detail )
注意!!!拼接!别小看这个,很重要。好多网站都需要拼接,虽然jobbole用不到,以后用到的地方很多!!
提取下一页:
>>> response.css(".next.page-numbers ::attr(href)").extract()[0]
注意,这个里面有两个标签,一个next和page-numbers,把两个合并起来,中间不要有空格,这个提取比较特殊。
三、写完了这也代码,有必要debug一下了。
# -*- coding: utf-8 -*-
importscrapy
importre
fromscrapy.httpimportRequest# 从scrap上让Request工具帮忙进行下载
fromurllibimportparse# 利用parse函数把url给join起来
classJobboleSpider(scrapy.Spider):
name ='jobbole'
allowed_domains = ['blog.jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']
defparse(self,response):
post_urls = response.css ('#archive .floated-thumb .post-thumb a ::attr(href)').extract ()# 从网页提取文章的URL,交给scrapy下载,并传递给parse_detail解析
forpost_urlinpost_urls:
yieldRequest (url=parse.urljoin ( response.url, post_url ),callback=self.parse_detail )
# callback回调进入datail周期进行循环
# yield是通过scrapy的Request()下载,并且交给自定义的parse_detail解析
#不是完整的地址,urljoin有两个参数,主域名自动拼接不完整的域名,并from urllib import parse
# 提取下一页并交给scrapy进行下载
next_url = response.css (".next.page-numbers::attr(href)").extract_first ("")
ifnext_url:
yieldRequest (url=parse.urljoin ( response.url, next_url ),callback=self.parse )
defparse_detail(self, response):
title= response.css (".entry-header h1::text").extract ()[0]
create_date=response.css("p.entry-meta-hide-on-mobile::text").extract()[0].strip()
praise_nums=response.css(".vote-post-up h10::text").extract()[0]
fav_nums=response.css(".bookmark-btn::text").extract()[0]
match_re = re.match (".*?(\d+).*", fav_nums )
ifmatch_re:
fav_nums=int(match_re.group (1))
else:
fav_nums=0
comment_nums=response.css("a[href='#article-comment'] span::text").extract()[0]
match_re = re.match(".*?(\d+).*", comment_nums)
ifmatch_re:
comment_nums=int(match_re.group (1))
else:
comment_nums=0
content=response.css ("div.entry").extract ()[0]
tag_list=response.css("p.entry-meta-hide-on-mobile a::text").extract()
tag_list = [elementforelementintag_listif notelement.strip ().endswith ("评论")]
tags=",".join ( tag_list )
pass