D:
进入D盘
scrapy startproject cnblogs
创建博客园项目
cd cnblogs
进入项目根目录
scrapy genspider blog cnblogs.com
创建爬虫文件
blog.py:
# -*- coding: utf-8 -*-
import scrapy
class BlogSpider(scrapy.Spider):
name = 'blog'
allowed_domains = ['cnblogs.com']
start_urls = ['https://www.cnblogs.com/']
def parse(self, response):
homePage = response.css('.post_item_body')
# 提取首页展示的正文,保存至变量homePage
for v in homePage:
# 循环获取每一条里面的标题与作者
titlelnk = v.css('.titlelnk::text').extract_first()
# 提取标题
lightblue = v.css('.lightblue::text').extract_first()
# 提取作者
"""
接下来进行写文件操作,每个作者的帖子储存在一个txt文档里面
"""
fileName = '%s-帖子.txt' % lightblue
# 定义文件名,如:作者-帖子.txt
with open(fileName, "a+") as f:
# 不同作者的标题保存在不同的txt文档,“a+”以追加的形式
f.write(titlelnk)
f.close()
scrapy crawl blog
运行爬虫
首页展示的20条博客的标题和作者:
爬取下一页:
blog.py:
# -*- coding: utf-8 -*-
import scrapy
class BlogSpider(scrapy.Spider):
name = 'blog'
allowed_domains = ['cnblogs.com']
start_urls = ['https://www.cnblogs.com/']
def parse(self, response):
homePage = response.css('.post_item_body')
# 提取首页展示的正文,保存至变量homePage
for v in homePage:
# 循环获取每一条里面的标题与作者
titlelnk = v.css('.titlelnk::text').extract_first()
# 提取标题
lightblue = v.css('.lightblue::text').extract_first()
# 提取作者
"""
接下来进行写文件操作,每条帖子的标题储存在一个txt文档里面
"""
fileName = '%s-帖子.txt' % lightblue
# 定义文件名,如:作者-帖子.txt
with open(fileName, "a+") as f:
# 不同作者的标题保存在不同的txt文档,“a+”以追加的形式
f.write(titlelnk)
f.close()
"""
接下来我们需要判断下一页是否存在,
如果存在,
我们需要继续提交给parse执行
关键看scrapy如何实现链接提交
"""
next_page = response.css('.pager a:contains("Next")::attr(href)').extract_first()
# css选择器提取下一页链接
if next_page is not None:
# 判断是否存在下一页
"""
如果是相对路径,如:/page/1
urljoin能把相对地址转换成绝对地址
最终next_page为:https://www.cnblogs.com/#p2
"""
next_page = response.urljoin(next_page)
"""
接下来就是爬取下一页或是内容页的秘诀所在:
scrapy给我们提供了这么一个方法:scrapy.Request()
这个方法还有许多参数,后面我们慢慢说,这里我们只使用了两个参数
一个是:我们继续爬取的链接(next_page),这里是下一页链接,当然也可以是内容页
另一个是:我们要把链接提交给哪一个函数(callback=self.parse)爬取,这里是parse函数,也就是本函数
当然,我们也可以在下面另写一个函数,比如:内容页,专门处理内容页的数据
经过这么一个函数,下一页链接又提交给了parse,那就可以不断的爬取了,直到不存在下一页
"""
yield scrapy.Request(next_page, callback=self.parse)