一、總體思路:
1忘嫉、下載start_urls荤牍,交給parse方法處理,文章列表頁(yè)start_urls = ['http://blog.jobbole.com/all-posts/']
2庆冕、parse處理康吵,從中獲取本頁(yè)的文章url(以后獲取到文章首圖傳遞個(gè)自定義的parse_detail),和下一頁(yè)的url
3愧杯、將下一頁(yè)的url交給parse方法涎才。繼續(xù)進(jìn)行1和2;將文章url傳遞給自定義的解析函數(shù)parse_detail
4力九、parse方法對(duì)下一頁(yè)的url進(jìn)行下載耍铜,自定義的parse_detial則通過(guò)css或者xpath 解析有用的信息傳遞給Item,次數(shù)兩個(gè)操作是異步操作
二跌前、進(jìn)行兩步操作:
1棕兼、從頁(yè)面抓取所有的文章url交給解析器進(jìn)行解析這個(gè)頁(yè)面的標(biāo)題時(shí)間點(diǎn)贊數(shù)等
2、從頁(yè)面抓取下一個(gè)頁(yè)面的url 進(jìn)行下載
以上兩部是異步進(jìn)行的抵乓,什么叫異步伴挚。就是小明一邊在吃冰棍,一邊在看電視灾炭,懂了嗎茎芋?
>>> 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/']
這樣順利的把列表頁(yè)的href都提取出來(lái)啦!
tips:別忘了蜈出,在導(dǎo)入庫(kù)上面要加入:from scrapy.http import Request# 從scrap上讓Request工具幫忙進(jìn)行下載
#從網(wǎng)頁(yè)提取文章的URL,交給scrapy下載田弥,并傳遞給parse_detail解析
#不是完整的地址,urljoin有兩個(gè)參數(shù)铡原,主域名自動(dòng)拼接不完整的域名偷厦,并from urllib import parseyield 拼拼接過(guò)程:Request ( url=parse.urljoin ( response.url, post_url ), callback=self.parse_detail )
注意I烫尽!只泼!拼接剖笙!別小看這個(gè),很重要请唱。好多網(wǎng)站都需要拼接弥咪,雖然jobbole用不到,以后用到的地方很多<巍酪夷!
提取下一頁(yè):
>>> response.css(".next.page-numbers ::attr(href)").extract()[0]
注意,這個(gè)里面有兩個(gè)標(biāo)簽孽惰,一個(gè)next和page-numbers,把兩個(gè)合并起來(lái)鸥印,中間不要有空格勋功,這個(gè)提取比較特殊。
三库说、寫完了這也代碼狂鞋,有必要debug一下了。
# -*- coding: utf-8 -*-
importscrapy
importre
fromscrapy.httpimportRequest# 從scrap上讓Request工具幫忙進(jìn)行下載
fromurllibimportparse# 利用parse函數(shù)把url給join起來(lái)
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 ()# 從網(wǎng)頁(yè)提取文章的URL,交給scrapy下載潜的,并傳遞給parse_detail解析
forpost_urlinpost_urls:
yieldRequest (url=parse.urljoin ( response.url, post_url ),callback=self.parse_detail )
# callback回調(diào)進(jìn)入datail周期進(jìn)行循環(huán)
# yield是通過(guò)scrapy的Request()下載骚揍,并且交給自定義的parse_detail解析
#不是完整的地址,urljoin有兩個(gè)參數(shù)啰挪,主域名自動(dòng)拼接不完整的域名信不,并from urllib import parse
# 提取下一頁(yè)并交給scrapy進(jìn)行下載
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 ("評(píng)論")]
tags=",".join ( tag_list )
pass