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. python之Python Eclipse+PyDec下载和安装教程(超级详细)

    Eclipse 是著名的跨平台 IDE 工具,最初 Eclipse 是 IBM 支持开发的免费 Java 开发工具,2001 年 11 月贡献给开源社区,目前它由非盈利软件供应商联盟 Eclipse ...

  2. mysql小白系列_09 mysql性能优化关键点

    一 服务器参数调优,有哪些关键点? 1. 应用访问优化 优化方法 性能提升效果 优化成本 说明 减少数据访问能不访问就不访问-减少磁盘IO 1~1000 低 缓存服务器缓存mysql数据,Redis. ...

  3. Centos7中磁盘管理及扩展

    前提要求: 虚拟机:centos7 虚拟机软件:VMware Workstation 12 在安装Centos系统时,磁盘选择为LVM逻辑卷.当选择为LVM后才能创建逻辑卷等(必须) 数据格式选择的是 ...

  4. HDU6040 Hints of sd0061

    题目链接:https://vjudge.net/problem/HDU-6040 题目大意: 给出 \(n\) 个数,有 \(m\) 次询问,每次询问这 \(n\) 个数中第 \(k+1\) 大的数是 ...

  5. SPOJ687 Repeats

    本篇是罗穗骞<后缀数组——处理字符串的有力工具>的读书笔记. 知识点: 后缀数组.RMQ 解题思路: 枚举长度 \(L\),然后检查长度为 \(L\) 的子串最多能连续重复几次. 对于给定 ...

  6. PHP常量的定义和用法

    我们通常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,也可减少团队开发的出错.那么define和const有什么区别呢? 1.const是一个语言结构:而define是一个函数 ...

  7. Ajax用法查询

    1)$.get(url, [data], [callback], [type]) 2)$.post(url, [data], [callback], [type]) 其中: url:代表请求的服务器端 ...

  8. SpringCloud(四)- Hystris简介及@EnableCircuitBreaker 和 @HystrixCommand 注解的使用

    唯能极于情,故能极于剑有问题或错误请及时联系小编或关注小编公众号 “CodeCow”,小编一定及时回复和改正,期待和大家一起学习交流 此文由四部分组成(Hystris简介.@EnableCircuit ...

  9. 【SocketIoClientDotNet】Nuget包安装问题

    问题: Nuget安装[SocketIoClientDotNet]失败 错误信息: Operation failed Expected 1 export(s) with contract name & ...

  10. 四、Spring-面向切面编程

    内容 面向切面编程基本原理 通过POJO创建切面 使用@AspectJ注解 为AspectJ切面注入依赖 关键词 横切关注点(cross-cutting concern) 继承 (inheritanc ...