cnblogs 博客爬取 + scrapy + 持久化 + 分布式
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 + 持久化 + 分布式的更多相关文章
- scrapy 博客爬取
item.py import scrapy class FulongpjtItem(scrapy.Item): # define the fields for your item here like: ...
- 使用org-mode写cnblogs博客
使用org-mode写cnblogs博客 */--> pre.src {background-color: #002b36; color: #839496;} pre.src {backgrou ...
- 把cnblogs变成简书 - cnblogs博客自定义皮肤css样式
吐槽 博客园cnblogs作为老牌的IT技术博客类网站,为广大的开发者提供了非常不错的学习交流平台. 虽然博客内容才是重点,但是如果有赏心悦目的页面不更好吗! cnblogs可以更换博客模板,并且提供 ...
- cnblogs博客申请完毕,以后再这里安家落户
cnblogs博客申请完毕,以后再这里安家落户,之前的博客就不转载了,好好搞技术,安稳过日子.
- 使用自己的域名解析cnblogs博客(CSDN也可以)
本文主要介绍怎样使用自己购买的域名指向cnblogs博客 通常来说技术人员都会创建个自己的技术博客,总结下工作中的问题,经验等等,不过某些博客的访问链接的确是不太容易记忆或者输入,对我们分享造成一定的 ...
- 使用自己的域名解析 cnblogs 博客
使用自己的域名解析 cnblogs 博客(博客园) 1.实现原理 用户访问 -> 阿里云解析 -> github page 跳转 -> 真实的博客地址 2.创建 github pag ...
- cnblogs博客迁移到hexo
cnblogs博客备份 备份地址:https://i.cnblogs.com/BlogBackup.aspx?type=1 备份文件为xml格式,打开备份文件,如下所示: <?xml versi ...
- 利用Word发布文章到cnblogs博客
利用Word发布文章到cnblogs博客 用博客园cnblogs:http://www.cnblogs.com/博客名称/services/metablogapi.aspx,word老是提醒" ...
- org-mode 写 cnblogs 博客
1. 为什么用org-mode写博客 我最开始用Emacs, 是因为org-mode.这是一个专注于写,而让我忽略展示结果的一种写作方式.为 什么这么说?因为所有内容的格式都是可定制的.按照自己喜欢的 ...
随机推荐
- 9.5 Go 依赖管理
9.5 Go 依赖管理 godep是解决包依赖的管理工具,目前最主流的一种,原理是扫描记录版本控制的信息. A. 所有的第三方包都放在$GOPATH的src目录下. B. 如果不同程序依赖的版本不一样 ...
- 自定义docker的镜像
- 对比Memcached和Redis,谁才是适合你的缓存?
Memcached vs Redis 近期公司采购软件,评估时,某软件谈到使用了 Memcached 和 Redis 缓存.在本文中,将研究这两个流行的缓存的异同,方便理解和记忆. 1. Memcac ...
- mysql事务与锁机制详解
一.事务 1.事务简介 (1)事务的场景 转账:一个账户减少,另一个账户增加.两个动作同时成功或者同时失败.就要开启事务. (2)事务定义 事务是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数 ...
- poj3680 最大权不相交路径
Intervals Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 8587 Accepted: 3662 Descrip ...
- node进程间通信
作为一名合格的程序猿/媛,对于进程.线程还是有必要了解一点的,本文将从下面几个方向进行梳理,尽量做到知其然并知其所以然: 进程和线程的概念和关系 进程演进 进程间通信 理解底层基础,助力上层应用 进程 ...
- git简单的使用步骤
Git介绍 Git是分布式版本控制系统 集中式VS分布式,SVN VS Git 1)SVN和Git主要的区别在于历史版本维护的位置 2)这两个工具主要的区别在于历史版本维护的位置Git本地仓库包含代码 ...
- Eclipse中java文件选中变量名,相同变量都变色显示 .
第一步设置高亮显示的颜色: Window-->preferences-->General-->Editors-->Text Editors-->Annotations-- ...
- [安卓自动化测试] 001.UIAutomator初探
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- Shellshock漏洞复现
漏洞分析: exp: curl -A "() { :; }; echo; /bin/cat /etc/passwd" http://172.16.20.134:8080/victi ...