在前几次学习中,我学会了获取一篇文章并实现字段解析。现在是要通过第一个url开始爬取所有的文章。如何获取下一页的url交给scrapy进行下载,首先要考虑的问题。当前列表
我在scrapy shell中调试一下,如下图
不曾想到出现了ios,php的文章url,并不完全是我们想要的url。
如图所示,我们就提取出了当前页的所有文章的url。当前页是取到了,但是如何提取下一页的呢?看看伯乐在线的网页结构,我找到了下一页按钮
然后打开网页调试器。找到对应位置。
这样子就找到了下一页。
最终调试
# -*- coding: utf-8 -*-
import scrapy
import re
from scrapy.http import Request
from urllib import parse
class JobboleSpider(scrapy.Spider):
name = 'jobbole'
allowed_domains = ['blog.jobbole.com']
start_urls = ['http://blog.jobbole.com/all-posts/']
def parse(self, response):
#1.获取文章列表页中的url并交给scrapy下载后进行解析
#2.获取下一页的url并交给scrapy进行下载,下载完成后交给parse
#解析列表页中的所有文章url交给scrapy下载后进行解析
post_urls = response.css("#archive .floated-thumb .post-thumb a::attr(href)").extract()
for post_url in post_urls:
yield Request(url=parse.urljoin(response.url,post_url),callback=self.parse_detail)
#提取下一页并交给scrapy进行下载
next_url = response.css(".next.page-numbers::attr(href)").extract_first("")
if next_url:
yield Request(url=parse.urljoin(response.url, next_url), callback=self.parse)
def parse_detail(self, response):
#通过CSS选择器提取文章具体字段
title = response.css(".entry-header h1::text").extract()[0]
create_date = response.css(".entry-meta-hide-on-mobile::text").extract()[0].strip().replace("·","").strip()
praise_numbers = response.css(".vote-post-up h10::text").extract()[0]
fav_nums = response.css("span.bookmark-btn::text").extract()[0]
match_re = re.match(".*?(\d+).*", fav_nums)
if match_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)
if match_re:
comment_nums = int(match_re.group(1))
else:
comment_nums = 0
content = response.css("div.entry").extract()[0]
tags = response.css("p.entry-meta-hide-on-mobile a::text").extract()[0]
pass