以http://blog.jobbole.com/all-posts/
頁面為例
1、提取列表頁
獲取一個列表頁
首頁獲得頁面文章列表,使用css選擇器進行:
article_list = response.css('#archive .floated-thumb .post-thumb a::attr(href)').extract()
Paste_Image.png
在文件中引入Request庫
from scrapy.http import Request
使用Request進行對上節函數的調用
def parse(self, response):
"""
1、獲取文章列表頁url并交給scrapy進行解析
2、獲取下一個文章列表頁
"""
article_list = response.css('#archive .floated-thumb .post-thumb a::attr(href)').extract()
for article in article_list:
yield Request(url=article, callback=self.parse_detail)
最后一句為對每個url調用parse_detail進行解析。這里的article的網址為帶完整域名的格式,如果不是完整域名,則需要對域名進行拼接成完成域名進行解析。
首先要引入from urllib import parse
,通過parse自帶的parse.urljoin()
進行拼接,代碼為:yield Request(url=parse.urljoin(response.url, article), callback=self.parse_detail)
獲取下一個列表 頁
每個列表頁都有“下一頁”鏈接,通過extract_first("")來得到下一頁鏈接,如果為空則表示完成。
next_list = response.css('.next.page-numbers::attr(href)').extract_first("")
if next_list:
yield Request(url=parse.urljoin(response.url, next_list), callback=self.parse)
2、對具體內容頁面提取
解析函數如下:
def parse_detail(self, response):
title = response.css('div.entry-header h1::text').extract_first()
create_date = response.css('p.entry-meta-hide-on-mobile::text').extract()[0].replace('·','').strip()
fav_nums = response.css("span.bookmark-btn::text").extract()[0]
match_re = re.match(".*?(\d+).*", fav_nums)
if match_re:
fav_nums = match_re.group(1)
comment_nums = response.css("a[href='#article-comment'] span::text").extract()[0]
match_re = re.match(".*?(\d+).*", comment_nums)
if match_re:
comment_nums = match_re.group(1)
content = response.css(".entry").extract()[0]
tag_list = response.css('p.entry-meta-hide-on-mobile a::text').extract()
tag_list = [e for e in tag_list if not e.strip().endswith("評論")]
tags = ",".join(tag_list)
print(title, create_date, fav_nums, comment_nums, tags)
通過以上代碼,即可將相應內容提取出來了。
Paste_Image.png