python爬虫之编码制内容转化、json追加写入、繁体转简体

写在前面的话: 总结一下学到的内容,还有在做项目中遇到的问题及其解决方式。都是为了学习巩固,有什么不对的地方还希望各位大佬指正出来,不胜感激。

1. 将编码制内容转换成可读内容

我们可以看到源码和网页审查元素不一样,正文实际上是在 js 代码中,那么可以通过正则获取再去进行解析。

from lxml import etree
import re

***

text = re.findall("<script>.*?var.*?content='(<p>.*?/p>)'.*?</script>", htmlstring, re.S|re.M)[0]
sub_html = etree.HTML(text)
contents = sub_html.xpath('//p//text()')
content = ' '.join(i.replace('\n', ' ').strip() for i in contents)

这样得到的内容仍然是编码制的,我们将其进行转换,其实这是unicode码,我们将其编码再解码即可。

content = content.encode('utf-8').decode("unicode-escape")
print(content)

2. json 追加模式去写入

要求是爬取的所有内容返回一个json,也就是所有网站存储到一个连接里,但是同时跑完存到一个列表里会有处理失败而中断的风险,所以追加是最好的方式,倒腾了几个小时才真正理解其用法,记录一下。

重点在于 json 要追加之前必须先 load 出来,才能 dump

  • 里面有段代码是用来锁文件的,是因为在多线程以及多进程的处理下,单个文件存储必会发生安全问题,因此加入了文件锁,具体可查看相关内容 Python多进程操作同一个文件,文件锁问题,不过进程锁有没有用我还没尝试,而且 fcntl 这个库只能在linux下使用。如果是对线程安全问题进行解决的话,可以直接用 threading.Lock() 去解决
def writeJson(urlpage, title, author):
    """每次返回的是经过处理的一个网站的url,作者,标题等等(删除了一些字段)"""

    # 通过列表去存储数据,再存储为json格式
    datas = []
    data = {}
    data['URLPAGE'] = urlpage
    data['TITLE'] = title
    data['AUTHOR'] = author
    datas.append(data)
    filename = 'datas.json'  # 这个一般是通过程序获取,我随便定义了一个名字
    # 判断是否为第一个存储的值,因为得保证每次打开文件获取到的内容是一个列表,而不是一个字典,如果没有理解这句话可以单步调试一下查看r变量
    if os.path.isfile(filename) and os.path.getsize(filename) > 0:
        f = open(filename, 'r', encoding='utf-8')
        # fcntl.flock(f.fileno(), fcntl.LOCK_EX)
        r = json.load(f)
        f.close()
        f = open(filename, 'w', encoding='utf-8')
        # 添加内容
        r.append(data)
        json.dump(r, f)
        f.close()
    else:
        f = open(filename, 'w', encoding='utf-8')
        # fcntl.flock(f.fileno(), fcntl.LOCK_EX)
        json.dump(datas, f)
        f.close()

3. 繁体转简体

转自 python的繁体简体转换

最好用的一个了,效果还佳

# 安装
# pip install opencc-python-reimplemented

# t2s - 繁体转简体(Traditional Chinese to Simplified Chinese)
# s2t - 简体转繁体(Simplified Chinese to Traditional Chinese)
# mix2t - 混合转繁体(Mixed to Traditional Chinese)
# mix2s - 混合转简体(Mixed to Simplified Chinese)

import opencc
cc = opencc.OpenCC('t2s')
s = cc.convert('*****') # 自己随便找一段
print(s)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值