实用scrapy批量下载自己的博客园文章

首先,在items.py中定义几个字段用来保存网页数据(网址,标题,网页源码)

如下所示:

import scrapy

class MycnblogsItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    page_title = scrapy.Field()
    page_url = scrapy.Field()
    page_html = scrapy.Field()

最重要的是我们的spider,我们这里的spider继承自CrawlSpider,方便我们定义正则来提示爬虫需要抓取哪些页面。

如:爬去下一页,爬去各个文章

在spdier中,我们使用parse_item方法来解析目标网页,从而得到文章的网址,标题和内容。

注:在parse_item方法中,我们在得到的html源码中,新增了base标签,这样打开下载后的html文件,不至于页面错乱,而是使用博客园的css样式

spdier源码如下:

# -*- coding: utf-8 -*-
from mycnblogs.items import MycnblogsItem
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule

class CnblogsSpider(CrawlSpider):
    name = "cnblogs"
    allowed_domains = ["cnblogs.com"]
    start_urls = [‘http://www.cnblogs.com/hongfei/‘]
    rules = (
        # 爬取下一页,没有callback,意味着follow为True
        Rule(LinkExtractor(allow=(‘default.html\?page=\d+‘,))),
        # 爬取所有的文章,并使用parse_item方法进行解析,得到文章网址,文章标题,文章内容
        Rule(LinkExtractor(allow=(‘hongfei/p/‘,)), callback=‘parse_item‘),
        Rule(LinkExtractor(allow=(‘hongfei/articles/‘,)), callback=‘parse_item‘),
        Rule(LinkExtractor(allow=(‘hongfei/archive/\d+/\d+/\d+/\d+.html‘,)), callback=‘parse_item‘),
    )

    def parse_item(self, response):
        item = MycnblogsItem()
        item[‘page_url‘] = response.url
        item[‘page_title‘] = response.xpath("//title/text()").extract_first()
        html = response.body.decode("utf-8")
        html = html.replace("<head>", "<head><base href=‘http://www.cnblogs.com/‘>")
        item[‘page_html‘] = html
        yield item

在pipelines.py文件中,我们使用process_item方法来处理返回的item

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import codecs

class MycnblogsPipeline(object):

    def process_item(self, item, spider):
        file_name = ‘./blogs/‘ + item[‘page_title‘] + ‘.html‘
        with codecs.open(filename=file_name, mode=‘wb‘, encoding=‘utf-8‘) as f:
            f.write(item[‘page_html‘])
        return item

以下是item pipeline的一些典型应用:

  • 清理HTML数据
  • 验证爬取的数据(检查item包含某些字段)
  • 查重(并丢弃)
  • 将爬取结果保存到数据库中

为了启用一个Item Pipeline组件,你必须将它的类添加到 ITEM_PIPELINES 配置,就像下面这个例子:

ITEM_PIPELINES = {
   ‘mycnblogs.pipelines.MycnblogsPipeline‘: 300,
}

程序运行后,将采集所有的文章到本地,如下所示:

原文地址:http://www.cnblogs.com/hongfei/p/6659934.html

时间: 2024-10-12 19:47:26

实用scrapy批量下载自己的博客园文章的相关文章

简单爬虫-抓取博客园文章列表

原文:简单爬虫-抓取博客园文章列表 如果使用对方网站数据,而又没有响应的接口,或者使用接口不够灵活的情况下,使用爬虫在合适不过了.爬虫有几种,对方网站展示形式有几种都是用分析,每个网站展示有相似的地方,有不同的地方. 大部分使用httpRequst就能完成,不管是否添加了口令.随即码.请求参数.提交方式get或者post.地址来源.多次响应等等.但是有些网站使用ajax如果是返回json或固定格式的也好处理,如果是很复杂的,可以使用webbrower控件进行抓取,最后正则解析,获取所需要的数据即

Python抓拍博客园文章,并存入数据库

在学习python后,想做个爬虫,抓取博客园文章. 爬虫思路很简单,模拟浏览器访问网页,得到网页的html代码,再根据页面结构,从html中提取自己需要的内容. 本文代码主要分为3个部分: 1.读取博客园首页文章链接. https://www.cnblogs.com/是博客园的首页,列出了文章,分析页面内容,读取文章的链接. 这需要看页面的结构,可以使用浏览器,再浏览页面代码,选择元素,看界面上选中哪一部分,根据自己的需要,可以看到对应模块的代码. 2.对于每个页面,分析页面内容. 这需要看页面

利用GitHook实现博客园文章的备份和自动发布

在使用vscode中的writecnblog插件时有所启发,链接: 用vscode写博客和发布,大家可以看看. 我们在本地可以利用git轻松实现博客园文章的历史记录管理,利用博客园的MetaWeblog API 别人的介绍编写小程序来自动化上传文章(参考插件). 更进一步,将这个程序放到githook里,每次commit时自动执行,就实现了现博客园文章的备份和自动发布. 这样,你每次发布文章的步骤就简化为: 编写本地一个Git仓库内的xx.md文件 commit更改 程序会自动获取diff,然后

利用GitHook实现博客园文章的备份和自动发布.md

在使用vscode中的writecnblog插件时有所启发,链接: [用vscode写博客和发布](https://www.cnblogs.com/caipeiyu/p/5475761.html),大家可以看看. 我们在本地可以利用git轻松实现博客园文章的历史记录管理,利用博客园的MetaWeblog API [别人的介绍](https://www.cnblogs.com/caipeiyu/p/5354341.html)编写小程序来自动化上传文章(参考插件). 更进一步,将这个程序放到gith

JS批量删除博客园文章

$('tr').each(function(){ if($(this).attr('id')!=null){ var s = $(this).attr('id').slice(9); console.info("正在删除:"+s); deletePost(s); } }); window.location.reload(); 以前都是用新浪博客的,但是新浪博客对编程类文章支持不好,记录一些html代码总是隐藏. 第一次用博客园,被他简洁的界面吸引. 一看还有博客搬家功能,于是把新浪博客

你博客园文章中的图片可以放大吗?反正我的是可以放大了!

序 看看项目经理是如何实现的? 插件选择 试了几个插件,感觉还是 lightbox 插件好用,链接:https://github.com/lokesh/lightbox2,该插件具备如下几个特点: 点击图片后根据图片实际尺寸自动显示 图片有加载动画特效,有前.后.关闭按钮 想看详细介绍,可以查看:https://www.lokeshdhakar.com/projects/lightbox2/ 具体实现 通过上面的链接下载好后需要如下几个文件:lightbox.css.lightbox-plus-

博客园文章添加版权信息的方法

管理--操作--博客签名,进入到制作签名的页面.在"内容"的文本框输入如下信息并替换相应的文字: <div>作者:<a href="http://www.cnblogs.com/lamp01/" target="_blank">郁冬</a></div><div>出处:<a href="http://www.cnblogs.com/lamp01/" target=

对博客园文章审核规则的质疑

几次发文章都被移出首页,让我很是郁闷. http://www.cnblogs.com/zhupengfei/p/8983666.html http://www.cnblogs.com/zhupengfei/p/8934072.html 移出的原因都是因为图片太多,文字太少. 我就很郁闷了,实例讲解,不用图片用什么?文字能有图片描述的清楚吗? 同样的文章在CSDN就没有任何问题,几分钟后就可以审核通过. 目前还有一个问题就是我在博客园发的文章无法被百度收录到,而在CSDN的却可以. 是否考虑转到C

博客园文章转PDF之非多线程方式

问题: 现在博客园写的文章想要在自己本地存一份,一个一个复制有点麻烦,希望能够程序化解决这个问题 思路: 博客园园第二页会出现页码,可以通过请求第二页,获得页面信息,然后把总页码获取到 每个页面的地址一样除了页码的地方不一样,因此,循环总页码,就可以得到每一个文章列表页的内容 得到了文章列表页的内容,可以把每个文章列表的文章链接获取到,且放在list中 循环文章链接,访问文章页面,获取文章标题和内容,并加上head,得到文章HTML且排除了左边栏及上下底部 把生成的HTML且排除了非文章内容的文