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.这是一个专注于写,而让我忽略展示结果的一种写作方式.为 什么这么说?因为所有内容的格式都是可定制的.按照自己喜欢的 ...
随机推荐
- Nginx服务器的安装和卸载
Nginx的安装 安装Nginx之前,需要先获取Nginx的安装文件.我们可以在http://nginx.org/en/download.html获取各个版本的Nginx安装文件.大家可以按照自己的需 ...
- 「雕爷学编程」Arduino动手做(30)——光敏二极管模块
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(动手做)的理念,以学习和交流为目的,这里准备逐 ...
- 微信小程序通信录
第一步:phone.wxml中 <view bindlongtap="clickPhone">{{phoneNum}}</view> 第二步:phone.j ...
- 数据结构----二叉树Tree和排序二叉树
二叉树 节点定义 class Node(object): def __init__(self, item): self.item = item self.left = None self.right ...
- 2.6 Golang命令
在命令行执行go命令查看相关的Go语言命令: Go is a tool for managing Go source code. Usage: go command [arguments] The c ...
- CF861D
题目链接:http://codeforces.com/contest/861/problem/D 解题思路: 优雅的暴力. 对于输入的每一个号码,从短到长找出它的所有子串,用 vector 保存每个号 ...
- Spring Boot 教程(2) - Mybatis
Spring Boot 教程 - Mybatis 1. 什么是Mybatis? MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 J ...
- Spring_api方式实现aop
第一步: public interface UserService { public void add(); public void update(int a); public void delete ...
- [工具推荐]_iOS音频批量转换
通常为了便于市场推广和获得更高的下载量,产品安装包的体积是越小越好.那么问题来了,要如何才能做到使安装包的体积最小化呢.根据产品的组成成分,最终可以大概分为,代码,图片,视频,音频等这几部分,今天我们 ...
- Node.js躬行记(2)——文件系统和网络
一.文件系统 fs模块可与文件系统进行交互,封装了常规的POSIX函数.POSIX(Portable Operating System Interface,可移植操作系统接口)是UNIX系统的一个设计 ...