上章回顾
上一章Python实战演练之scrapy初体验中讲到了scrapy项目的创建,爬虫的创建,以及数据的提取。
跨页爬取如何实现
不过这些都是建立在单页网页数据的爬取之中,很多时候我们需要跨很多页去爬取数据,这个时候该怎么实现呢?
首先分析该网页的下一页和本页的区别
- https://edu.csdn.net/courses/o280/p1 (第一页)
- https://edu.csdn.net/courses/o280/p2 (第二页)
可以明显判断出p后面的是页数,即修改该处即可获取下一页的数据
跨页爬取的实现
所以,srcapy的跨页爬取很好实现,只用在courses.py中添加几行代码即可。
import scrapy
from educsdn.items import CoursesItem
class CoursesSpider(scrapy.Spider):
name = 'courses'
allowed_domains = ['edu.csdn.net']
start_urls = ['https://edu.csdn.net/courses/o280/p1']
#第一页
p = 1
def parse(self, response):
# 解析课程信息
# 获取当前请求页面下的所有课程信息
print(dd.xpath("./div[@class='titleInfor'/text()]").extract())
dl = response.selector.css("div.course_item")
# 遍历课程信息并封装到item
for dd in dl:
item = CoursesItem()
item['title'] = dd.css("span.title::text").extract_first()
item['url'] = dd.css("a::attr(href)").extract_first()
item['pic'] = dd.css("img::attr(src)").extract_first()
item['teacher'] = dd.css("span.lecname::text").extract_first()
item['time'] = dd.css("span.course_lessons::text").extract_first()
item['price'] = dd.css("p.priceinfo i::text").extract_first()
print(item)
# 跨页提取信息
self.p += 1
if self.p < 4:
next_url = 'https://edu.csdn.net/courses/o280/p'+ str(self.p)
url = response.urljoin(next_url)
yield scrapy.Request(url=url,callback=self.parse)
self.p < 4
说明只爬取前三页的数据,具体输出和上一章差不多,只是多了2页的新增数据,这里就不列出了。