一、總體思路:
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