IO读写操作比较适合使用多线程,虽然python的多线程是伪多线程,但是CPU快速的在读取和写入之间切换,边爬取边写入,会比逐条进行读写的速度快。

import re
import requests
import csv
from queue  import Queue
import threadingclass POSpider(threading.Thread):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 QIHU 360SE','cookie':'Hm_lvt_9007fab6814e892d3020a64454da5a55=1599659724,1599704234; Hm_lpvt_9007fab6814e892d3020a64454da5a55=1599713077'}def __init__(self,page_queue,poems_queue,*args,**kwargs):super(POSpider,self).__init__(*args,**kwargs)self.page_queue = page_queueself.poems_queue = poems_queuedef run(self):sortP = []while True:if self.page_queue.empty():breakurl = self.page_queue.get()response = requests.get(url,headers=self.headers)text = response.texttitles = re.findall(r'div\sclass="cont".*?<b>(.*?)</b>',text,re.S)#爬取诗的标题poems = re.findall(r'div\sclass="contson".*?">.*?(.*?)</div>',text,re.S) #爬取诗的内容for poem in poems:sortPoems = re.sub('<.*?>','',poem)sortP.append(sortPoems)  #诗中有多余的标签,用空格替换掉,遍历加入新的列表for x,y in zip(titles,sortP): #一次遍历两个列表self.poems_queue.put((x,y)) #把标题和诗放入队列# print(x,y) #打印爬取的标题和内容print('+'*30+"第%s页已下载完成!" %url.split('0AA')[-1]+'+'*30)
class POWriter(threading.Thread):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 QIHU 360SE','cookie':'Hm_lvt_9007fab6814e892d3020a64454da5a55=1599659724,1599704234; Hm_lpvt_9007fab6814e892d3020a64454da5a55=1599713077'}def __init__(self,poems_queue,gLock,writer,*args,**kwargs):super(POWriter,self).__init__(*args,**kwargs)self.poems_queue = poems_queueself.writer = writerself.lock = gLockdef run(self):while True:try:poem_info = self.poems_queue.get(timeout=50)#获取到队列,超时x,y = poem_infoself.lock.acquire()self.writer.writerow((x,y)) #一次写入一首诗self.lock.release()print('保存一首')except:breakdef main():page_queue = Queue(10)poems_queue = Queue(30)gLock = threading.Lock()fp = open('chinapoems.csv','a',newline='',encoding='gbk')#用utf-8会乱码,gb2312部分不能写入writer = csv.writer(fp)writer.writerow(('title','content'))for x in range(1,6):url = 'https://so.gushiwen.cn/shiwen/default_0AA%d.aspx' % xpage_queue.put(url)for x in range(5):t = POSpider(page_queue,poems_queue)t.start()for x in range(5):t = POWriter(poems_queue,gLock,writer)t.start()
if __name__ == "__main__":main()

爬取的内容不存在问题,遍历的页面过多,写入到CSV速度很慢,而且会假死。分析大概是有比较复杂的中文字体,在编码的时候,写入困难。

事实证明的确是因为曹操诗句中有个复杂的汉字:䜩,以至于进行不下去。

UnicodeEncodeError details: ‘gbk’ codec can’t encode character ‘\u4729’ in position 126: illegal multibyte sequence 短歌行 两汉:曹操
对酒当歌,人生几何!譬如朝露,去日苦多。慨当以慷,忧思难忘。何以解忧?唯有杜康。青青子衿,悠悠我心。但为君故,沉吟至今。呦呦鹿鸣,食野之苹。我有嘉宾,鼓瑟吹笙。明明如月,何时可掇?忧从中来,不可断绝。越陌度阡,枉用相存。契阔谈䜩,心念旧恩。(谈䜩 一作:谈宴)月明星稀,乌鹊南飞。绕树三匝,何枝可依?山不厌高,海不厌深。周公吐哺,天下归心。

import re
import requestsheaders = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 QIHU 360SE','cookie':'Hm_lvt_9007fab6814e892d3020a64454da5a55=1599659724,1599704234; Hm_lpvt_9007fab6814e892d3020a64454da5a55=1599713077'}
def parse_page(url):poemsG = []authorG = []response = requests.get(url,headers=headers)text = response.texttitles = re.findall(r'div\sclass="cont".*?<b>(.*?)</b>',text,re.S)#爬取诗的标题poems = re.findall(r'div\sclass="contson".*?">.*?(.*?)</div>',text,re.S) #爬取诗的内容authors = re.findall(r'p\sclass="source".*?>.*?(.*?)</p>',text,re.S)for i in authors:author = re.sub('<.*?>','',i)authorG.append(author)for i in poems:Poem = re.sub('<.*?>','',i)poemsG.append(Poem)  #诗中有多余的标签,用空格替换掉,遍历加入新的列表g = list(map(lambda x,y,z:'\t'+x+'\t\t'+y+z+'\n',titles,authorG,poemsG)) #列表一一映射组合在一起成新列表,合适的组合空格加上回车return gdef  main():for x in range(1,40):url = 'https://so.gushiwen.cn/shiwen/default_0AA%d.aspx' % xcontents = parse_page(url)for i in contents:try:with open('chinapoems'+'.txt','a') as f:# write()不能是字典、元组和列表f.write(i)except UnicodeEncodeError as e:print("UnicodeEncodeError details: " +str(e)+i) #显示到底是哪里出错了passif __name__ == "__main__":main()

古诗+代码 = 绝配相关推荐

  1. win7配置C语言VS2010,开发Windows7软件的绝配:Visual Studio 2010

    Win7之家( www.win7china.com):开发Windows7软件的绝配:Visual Studio 2010 这里介绍在Visual Studio 2010中,微软花了很大的力气来使得非 ...

  2. 笔记本nc10装linux,绝配:Ubuntu 9.04与上网本(NC10)

    Ubuntu 9.04对NC10的兼容性相当好,FN键完全可用,结合Ubuntu 9.04全新的OSD(通知机制),简直酷毙了! 另外,我还发现,Ubuntu 9.04支持NC10的屏幕亮度调节档数, ...

  3. 艾尔登法环绝配:iGame加推双风扇白色版RTX 3050

    <艾尔登法环(Elden Ring)>堪称游戏荒救世主",发售之后立刻在游戏圈中掀起了一阵魂学"狂潮,Steam的在线人数也一度突破上限. 老头环"的火爆,也 ...

  4. pr文字转语音有插件吗_自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配...

    原标题:自媒体非常实用的文字转语音软件,配合PR软件实用简直绝配 大家都知道抖音越来越火,里面有很多小姐姐.小哥哥声音都是那么甜蜜好听,有很多微信公证号里面都插入语音了,有很好的电影片段想要配音,可惜 ...

  5. Apche Phoenix,Spark的绝配搭档

    Spark相信大家不会陌生,翻开有关大数据的报刊杂志,大家都在讨论Spark.也会有不少公司依靠Spark构建数据仓库. 但我今天介绍的是另一款软件Apache Phoenix.那么它是用来解决什么问 ...

  6. 十二星座“绝配”与“绝不配”

    十二星座"绝配"与"绝不配" 牡羊座3/21~4/20 天生绝配: 狮子,射手(等级速度) 相斥星座: 金牛,魔羯,处女(慢郎中) 天蝎,巨蟹(阴森) 金牛座4 ...

  7. 四月的“绝配”热点推荐 | 美通社公关传播月历

    经历了冬天的萧瑟与寒冷,进入4月以后,人们期待着来一场与大自然的亲密接触.疫情限制了人们的行动,却丝毫没有影响这种拥抱自然的渴望.对品牌故事而言,在这个充满生命力的4月,有哪些话题等待着被挖掘及有机结 ...

  8. 只有程序员才能看懂的30张图,绝配!

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 周末轻松一下! 「1」 当我演示一个功能, 但它没有按预期进行时. 「2」 Bug 变 ...

  9. python古诗代码案例_用python实现古诗词横板竖版显示 【二维列表的使用】

    案例展示用python实现古诗词横竖两种版本效果图 实现的代码如下: #古诗顺序倒叙读 str1="千山鸟飞绝" str2="万尽人踪灭" str3=" ...

最新文章

  1. 三、概念数据模型CDM(Conceptual Database Model )
  2. 如何在Swift中串联或合并数组?
  3. 数据挖掘的最佳学习清单
  4. vue系列(1)安装vue
  5. 通过trace跟踪系统调用
  6. Nacos源码处理心跳请求
  7. Potato的暑期训练day#1题解 ——毒瘤构造
  8. AngularJs学习笔记--Modules
  9. ashx在web.config中如何配置_如何在 Istio 1.6 中配置 Prometheus-Operator 和抓取指标
  10. Android设计原则及规范指南!UI设计师值得一看!
  11. win7计算机文件夹打开慢,win7开机很慢怎么办 win7电脑开机慢的优化教程
  12. 阿里云服务器mysql远程连接设置失败
  13. 一个文科小白的数据分析师之路
  14. java字符串反转异或_字符串反转总结】Java中七种方法实现
  15. python程序设计实训报告-Python编程实践(1)
  16. 怎么用python画sin函数图像_用python画三角函数
  17. Android | Tangram动态页面之路(七)硬核的Virtualview
  18. 华为云ManageOne北向对接之基本名词概念(一)
  19. QVector使用示例
  20. 如何使用OpenDNS有效解决DNS域名劫持?

热门文章

  1. 2018/01/22 爬虫日记
  2. C/C++对汉字的读取
  3. 如何区分MOS管、三极管(从MOS管、三极管的结构方面理解)
  4. 《把时间当作朋友》第1章读后感(二)
  5. Post Processing 后期处理
  6. 探析初代虚拟人Lil Miquela的陨落
  7. Java身份证号校验
  8. 什么是ALEO,深度解析及获取方法
  9. 开关二极管的作用是什么
  10. 读史有感(写于07年冬)