利用scrapy爬取句子迷网站优美句子存储到本地(喜欢摘抄的人有福了!)
1.前言
个人一直有收藏无意间觉得很优美的句子或者台词,我当初玩新浪微博的时候就是因为在微博上看到有的微博一直分享着特别好的台词或者句子。几乎我都抄下来了,虽然字写得不咋地,现在看到好的句子都会复制粘贴存到手机备忘录,有时间就会看,那么我就贴一下我收藏的吧(ps:下面的句子都是本人于茶余饭后,浏览于各大网站,抱着喜欢之心,收藏的,出处不详,如有侵权还望告知)
- 毁掉我们的不是我们所憎恨的东西,而恰恰是我们所热爱的东西。
这群人物不是英雄豪杰,也未必是元凶巨恶。他们的社会地位可能极低,也可能极高。很难说他们是好人还是坏人,但由于他们的存在,很多简单的事情变得混沌、暧昧、肮脏,许多祥和的人际关系变得紧张、尴尬…他们绝不想对什么负责,而且确实也无法让他们负责…
…你终于愤怒了,聚集起万钧雷霆准备轰击,没想到他们也在一起与你愤怒,你忽然失去了轰击对象…
…小人是什么? 如果说的清定义,他们也就没这么可恶了… - “凡心所向,素履以往,生如逆旅,一苇以航。”
- 层楼终究误少年,自由早晚乱余生。
- 血雨腥风成绝响,人间不见白梅香。良人随雪飘零去,生者独守十字伤。----《浪客剑心》 (ps:这我看动漫时看到的,现在读起来还是鸡冻?)
- 良言一句三冬暖,恶语伤人六月寒。
- .天下熙熙皆为利来,天下攘攘皆为利往。
- 此之蜜糖,彼之砒霜。
- 亲卿爱卿,是以卿卿,我不卿卿,谁当卿卿。
- 我天性不宜交际。在多数场合,我不是觉得对方乏味,就是害怕对方觉得我乏味。可是我既不愿意忍受对方乏味,也不愿意费劲使自己显得有趣,那都太累了。我独处时最轻松,因为我不会觉得自己乏味,即使乏味,也自己承受,不累及他人。
- 青灯照壁人初睡,冷雨敲窗被未温。
- 回忆能让一个人变的神经质前一秒还是嘴角微扬,下一秒却湿润了眼眶,这可能是一个突然的跟你记忆有关的瞬间,抑或相似的某个情节都足以让你忽然之间泪流满面……
- 去年元夜时,花市灯如昼。月上柳梢头,人约黄昏后。
今年元夜时,花与灯依旧。不见去年人,泪满春衫袖。 - 初听不知曲中意,再听已是曲中人。既然已成曲中人,何必再识曲中意。
- 自古表白多白表,从来情书难书情。
- 笑谈年少多少年,常与生人道人生。
2.新建scapy工程项目
之所以用下面这种crawl模板,是因为该模板更适合去提取出文章页面链接,避免我们过多的解析页面,scrapy会自动访问我们定义的url样式,大大节省访问时间。
创建名为juzimi的project,以及名为sentence的爬虫py文件。
scrapy startproject juzimi
cd juzimi
scrapy genspider -t crawl sentence www.juzimi.com#用的是scrapy提供的另外一种crawl模板
3.为了方便运行,还是在一级目录下新建main.py文件,代码如下:
from scrapy import cmdline
cmdline.execute('scrapy crawl sentence'.split())
4.编写item.py里面的代码如下:
class JuzimiItem(scrapy.Item):
title=scrapy.Field()#句子出处
sentence=scrapy.Field()#句子
writer=scrapy.Field()#作者
love=scrapy.Field()#喜爱数
url=scrapy.Field()#文章url,存储这个链接是为了方便上面某些字段不对,方便排错。
5.编写sentence.py里面的主函数代码:
# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from w3lib.html import remove_tags#python自带类,可去除内容里面的标签
from ..items import JuzimiItem#..代表相对路径即当前文件下
class SentenceSpider(CrawlSpider):
name = 'sentence'
allowed_domains = ['www.juzimi.com']
start_urls = [ 'https://www.juzimi.com/allarticle/jingdiantaici',
'https://www.juzimi.com/allarticle/sanwen' ]
rules = (
Rule(LinkExtractor(allow=r'article/\d+'), callback='parse_item', follow=True),
#句子列表url如:'https://www.juzimi.com/article/28410'
)
def parse_item(self, response):
sentences = [remove_tags(item) for item in response.css('.xlistju').extract()]
loves=[ item.lstrip('喜欢') for item in response.css('div.view-content:nth-child(2) .flag-action::text').extract()]
writers=[item.css('.views-field-field-oriwriter-value::text').extract() if item.css('.views-field-field-oriwriter-value::text') else ''
for item in response.css('div.view-content:nth-child(2) .xqjulistwafo')]
titles=[item for item in response.css('div.view-content:nth-child(2) .xqjulistwafo .active::text').extract()]
for sentence,love,writer,title in zip(sentences,loves,writers,titles):
item = JuzimiItem()
item['sentence']=sentence
item['love']=love
item['writer']=writer
item['title']=title
item['url']=response.url
return item
发现自己真的爱上了列表推导式,每个句子列表页各有10条句子,之所在不在句子详情页获取字段值,是考虑到详情页没有我想要的喜爱量,而且在列表页都都能获取到字段值,所有说没必要到详情页获取。有的句子是没有作者的,所有在列表推导式里面加了判断语句,如果有对应作者的标签就获取,没有就等于空’’。返回的item字段如下:
{'love': '(2139)',
'sentence': '陌上人如玉,公子世无双。',
'title': '木玉成约',
'url': 'https://www.juzimi.com/article/45916',
'writer': ['叶迷']}
{'love': '(110)',
'sentence': '生活总是索取大于给予。',
'title': '银河护卫队',
'url': 'https://www.juzimi.com/article/76689',
'writer': ''}
{'love': '(405)',
'sentence': "Secrets have a cost. They're not free. Not now, not ever. \r"
'秘密是有代价的。没有免费的秘密。现在没有,任何时候都没有。',
'title': '超凡蜘蛛侠',
'url': 'https://www.juzimi.com/article/27324',
'writer': ''}
{'love': '(140)',
'sentence': '仇恨就像毒药,慢慢的会让你的灵魂变得丑恶。',
'title': '蜘蛛侠3',
'url': 'https://www.juzimi.com/article/37095',
'writer': ''}
{'love': '(30)',
'sentence': '“从今以后,我将不再贪吃,而只是爱吃而已。”',
'title': '加菲猫的幸福生活',
'url': 'https://www.juzimi.com/article/362645',
'writer': ['加菲猫']}
6.利用CsvItemExporter保存到本地了
考虑到scraoy提供了exporter,可以查看expoter源码,scrapy提供多种导出方式,如下所示:
__all__ = ['BaseItemExporter', 'PprintItemExporter', 'PickleItemExporter',
'CsvItemExporter', 'XmlItemExporter', 'JsonLinesItemExporter',
'JsonItemExporter', 'MarshalItemExporter']
这里就利用CsvItemExporter导出器导出上面返回的item,因为csv格式文件可以通过excel打开。所以接下来编写pipelines.py里面的文件,代码如下:
class CsvExporterPipeline(object):
#利用scrapy提供的内置CsvExporter导出csv文件
def __init__(self):
self.file=open('new_sentence.csv','wb')#打开存储文件,文件有没有新建都不重要
self.exporter=CsvItemExporter(self.file,encoding='utf-8')#创建导出类对象,指定编码格式
self.exporter.start_exporting()#开始导入
def spider_closed(self,spider):
self.finish_exporting()#关闭导入
def process_item(self,item,spider):
self.exporter.export_item(item)
return item #传递item
代码写完记得在settings.py里面开启ITEM_PIPELINES,代码如下:
ITEM_PIPELINES = {
'juzimi.pipelines.CsvExporterPipeline':300,
}
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 2
USER_AGENT ='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
7.设置代理中间件。
满心欢喜的等待结果,结果给我报了个403禁止访问,后面直接给我封了ip,浏览器都不能访问了,无奈只能上代理了,代理大法好啊。这里推荐阿布云代理,有小时制,同时各种接口文档写的很详细,所以说还是比较方便的。以下代码为阿布云提供文档
import base64
# 代理服务器
proxyServer = "http://http-dyn.abuyun.com:9020"
# 代理隧道验证信息
proxyUser = "user"#购买后会有
proxyPass = "password"#购买后会有
proxyAuth = "Basic " + base64.urlsafe_b64encode(bytes((proxyUser + ":" + proxyPass), "ascii")).decode("utf8")
class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta["proxy"] = proxyServer
request.headers["Proxy-Authorization"] = proxyAuth
接下来只要配置中间件即可:
DOWNLOADER_MIDDLEWARES = {
'juzimi.middlewares.ProxyMiddleware': 543,
}
8.开启运行项目界面截图如下:
这里有一个小问题,生成的csv文件在pycharm里面打开都不是乱码的,记事本打开也不是乱码的,但是用excel打开就乱码了,后面我尝试着通过记事本指定编码格式为ascii另存为新的文件,再打开就时正常的了,csv文件截图如下:
这里我根据喜爱量排序下,贴出来吧,本打算只贴出前十名,翻着翻着后面竟然有我大亚索台词,HASAKI,那必须贴一波,看来亚索还是好多人都喜欢,台词听起来都霸气。