python3爬虫学习之数据存储txt的案例详解


Posted in Python onApril 24, 2019

上一篇实战爬取知乎热门话题的实战,并且保存为本地的txt文本

先上代码,有很多细节和坑需要规避,弄了两个半小时

import requests
import re
 
headers = {
 "user-agent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64)"
   " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari"
   "/537.36M",
 "cookie" : '_xsrf=H6hRg3qQ9I1O8jRZOmf4ytecfaKdf2es; _zap=296584df-ce11-4059-bc93-be10eda0fdc1; d_c0="AKBmB5e-PA-PTkZTAD1nQun0qMf_hmcEH14=|1554554531"; '
  'capsion_ticket="2|1:0|10:1554554531|14:capsion_ticket|44:Yjc0NjAzNDViMTIzNDcyZDg2YTZjYTk0YWM3OGUzZDg=|2d7f136328b50cdeaa85e2605e0be2bb931d406babd396373d15d5f8a6c'
  '92a61"; l_n_c=1; q_c1=ad0738b5ee294fc3bd35e1ccb9e62a11|1554554551000|1554554551000; n_c=1; __gads=ID=9a31896e052116c4:T=1554555023:S=ALNI_Mb-I0et9W'
  'vgfQcvMUyll7Byc0XpWA; tgw_l7_route=116a747939468d99065d12a386ab1c5f; l_cap_id="OGEyOTkzMzE2YmU3NDVmYThlMmQ4OTBkMzNjODE4N2Y=|1554558219|a351d6740bd01ba8ee34'
  '94da0bd8b697b20aa5f0"; r_cap_id="MDIzNThmZjRhNjNlNGQ1OWFjM2NmODIxNzNjZWY2ZjY=|1554558219|ff86cb2f7d3c6e4a4e2b1286bbe0c093695bfa1d"; cap_id="MGNkY2RiZTg5N2MzNDUyNTk0NmEzMTYyYzgwY'
  'zdhYTE=|1554558219|18ed852d4506efb2345b1dbe14c749b2f9104d54"; __utma=51854390.789428312.1554558223.1554558223.1554558223.1; __utmb=51854390.0.10.1554558223; __utmc=51854390; '
  '__utmz=51854390.1554558223.1.1.utmcsr=(direct'
  ')|utmccn=(direct)|utmcmd=(none); __utmv=51854390.000--|3=entry_date=20190406=1',
 "authority" : "www.zhihu.com",
 
}
url = "https://www.zhihu.com/explore"
response = requests.get(url=url , headers=headers)
text = response.text
# print(text)
titles = []
f_titles = re.findall(r'<div class="explore-feed feed-item".*?>.*?<a class="question_link".*?>(.*?)</a>.*?</h2>',text,re.S)
for title in f_titles:
 titles.append(title.strip())
# print("*"*30)
authors = []
f_authors = re.findall(r'<div class="zm-item-answer-author-info".*?>(.*?)</span>',text,re.S)[1:]
for f_author in f_authors:
 # print(f_author)
 author = re.sub(r'<.*?>|<a ([^>]*?)>' , "" , f_author,re.S).strip()
 authors.append(author)
# print("*"*30)
content_urls = re.findall(r'<div class="zh-summary summary clearfix">.*?<a href="(.*?)" rel="external nofollow" rel="external nofollow" .*?>.*?</a>',text,re.S)[1:]
contents = []
for content_url in content_urls:
 content_full_url = "https://www.zhihu.com" + content_url
 # print(content_full_url)
 resp = requests.get(url=content_full_url , headers=headers)
 c_text = resp.text
 content = re.findall(r'<div class="RichContent-inner">*?<span .*?>(.*?)</span>',c_text,re.S)
 content = str(content)
 # print(type(content))
 cont = re.sub(r'\\n|<.*?>',"",content).strip()
 # print(cont)
 contents.append(cont)
 
zhihu_questions = []
for value in zip(titles,authors,contents):
 title,author,content = value
 zhihu_question = {
 "标题" : title,
 "作者" : author,
 "内容" : content
 }
 zhihu_questions.append(zhihu_question)
 
# for zhihu_question in zhihu_questions:
# for value in zhihu_question.values():
#  print(value)
# print("=" * 50)
 
with open("知乎.txt" , "a" , encoding="utf-8") as fp:
 for zhihu_question in zhihu_questions:
 for value in zhihu_question.values():
  fp.write(value)
  fp.write('\n' + "="*10 + '\n')
 fp.write('\n' + "*"*50 + '\n')

我们用requests库和正则来爬取

因为要一直测试爬取内容是否正确,可能运行太频繁,博主中间被封了一次号,然后修改了cookie等信息,勉强获取到了内容。

正则表达式在之前讲的很多了,也有过实战,不多赘述,我们主要来讲爬取时遇到的问题。

爬取标题时很顺利,我们只需要去除空白就行了

当爬取作者时就有了问题,我们注意到,热门话题共有10篇,也就是10个作者,但在用正则获取时,要么第一个作者不对,要么就只有9个作者,我把所有热门话题url,标题,作者和内容打印出来,打开浏览器一个一个对应标题作者和内容是否正确,发现了一个神奇的现象。

一:作者数量不对

在知乎有匿名作者,这种作者和不匿名的作者都放在同一种div下,但匿名作者在span标签内,而不匿名作者在a标签下,所以当我用正则匹配a标签的内容,无法获取匿名用户,就导致作者数量不对。于是直接获取div下的所有内容,在用sub去掉不要的内容

二:作者与标题或内容不符

python3爬虫学习之数据存储txt的案例详解

1是第一个作者,他不是我们需要的,但我们爬取的第一个就是他,2才是热门的第一个作者

未获取匿名用户

这两个是我们无法正常获取的原因

上面两个问题这样解决:

f_authors = re.findall(r'<div class="zm-item-answer-author-info".*?>(.*?)</span>',text,re.S)[1:]
for f_author in f_authors:
 # print(f_author)
 author = re.sub(r'<.*?>|<a ([^>]*?)>' , "" , f_author,re.S).strip()
 authors.append(author)

获取所有未经处理的作者,我们不要第一个因为他不是热门话题的回答者,f_authors是含有大量标签的列表,大家可以打印看看

我们遍历这个未经处理的列表,打印未经处理的作者名,看看需要处理什么。

我们发现含有大量span标签和a标签,我们用sub函数处理

三:我们可以发现,这些内容是很长的:

python3爬虫学习之数据存储txt的案例详解

这样,我们获取的内容是不正常的,我们分析可以找到该话题对应的链接,我们加上域名就可以到这个话题的详情页

python3爬虫学习之数据存储txt的案例详解

python3爬虫学习之数据存储txt的案例详解

我们获取url,处理页面,获取内容,将获取的内容去掉标签等无关内容即可。

content_urls = re.findall(r'<div class="zh-summary summary clearfix">.*?<a href="(.*?)" rel="external nofollow" rel="external nofollow" .*?>.*?</a>',text,re.S)[1:]
contents = []
for content_url in content_urls:
 content_full_url = "https://www.zhihu.com" + content_url
 # print(content_full_url)
 resp = requests.get(url=content_full_url , headers=headers)
 c_text = resp.text
 content = re.findall(r'<div class="RichContent-inner">*?<span .*?>(.*?)</span>',c_text,re.S)
 content = str(content)
 # print(type(content))
 cont = re.sub(r'\\n|<.*?>',"",content).strip()
 # print(cont)
 contents.append(cont)

关于zip函数,我在上一篇爬取古诗文也用到了,很重要的函数:

zhihu_questions = []
for value in zip(titles,authors,contents):
 title,author,content = value
 zhihu_question = {
 "标题" : title,
 "作者" : author,
 "内容" : content
 }
 zhihu_questions.append(zhihu_question)

最后就是把获取的内容保存为本地txt文档

with open("知乎.txt" , "a" , encoding="utf-8") as fp:
 for zhihu_question in zhihu_questions:
 for value in zhihu_question.values():
  fp.write(value)
  fp.write('\n' + "="*10 + '\n')
 fp.write('\n' + "*"*50 + '\n')

这是最基本的保存爬取内容的方法。后续会有json,csv,数据库的相关博客续上。

运行结果:

python3爬虫学习之数据存储txt的案例详解

另,注释代码都是测试代码,可以参考。

补充:可能看得时候cookie信息会过期。

补充:文件打开的几种方式

1:r:只读模式,也是默认模式

2:rb:二进制只读

3:r+:读写方式

4:rb+:二进制读写方式

5:w:写方式

6:wb:二进制写方式

7:w+:读写方式

8:wb+:二进制读写方式

9:a:以追加方式,这个方式不会把原来的内容覆盖,本篇代码以此方式打开文件

10:ab:二进制追加方式

11:a+:读写方式

12:ab+:二进制读写方式

以上所述是小编给大家介绍的python3爬虫学习之数据存储txt的案详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python使用htpasswd实现基本认证授权的例子
Jun 10 Python
Python常见数据结构详解
Jul 24 Python
仅用500行Python代码实现一个英文解析器的教程
Apr 02 Python
Python深入06——python的内存管理详解
Dec 07 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
Python3单行定义多个变量或赋值方法
Jul 12 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
Python根据当前日期取去年同星期日期
Apr 14 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
Python基础之字符串常见操作经典实例详解
Feb 26 Python
解决c++调用python中文乱码问题
Jul 29 Python
Python3.5面向对象编程图文与实例详解
Apr 24 #Python
Python对ElasticSearch获取数据及操作
Apr 24 #Python
Python3.5面向对象与继承图文实例详解
Apr 24 #Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 #Python
基于python的ini配置文件操作工具类
Apr 24 #Python
python实现简单日期工具类
Apr 24 #Python
NumPy 基本切片和索引的具体使用方法
Apr 24 #Python
You might like
php 不使用js实现页面跳转
2014/02/11 PHP
php的curl封装类用法实例
2014/11/07 PHP
使用PHP编写发红包程序
2015/07/22 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
Laravel自定义 封装便捷返回Json数据格式的引用方法
2019/09/29 PHP
PHP 面向对象程序设计之类属性与类常量实现方法分析
2020/04/13 PHP
根据出生日期自动取得星座的js代码
2010/07/20 Javascript
jQuery aminate方法定位到页面具体位置
2013/12/26 Javascript
js确认删除对话框适用于a标签及submit
2014/07/10 Javascript
了解Javascript的模块化开发
2015/03/02 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
jquery html5 视频播放控制代码
2016/11/06 Javascript
JS作用域深度解析
2016/12/29 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
anime.js 实现带有描边动画效果的复选框(推荐)
2017/12/24 Javascript
分享5个好用的javascript文件上传插件
2018/09/16 Javascript
JQuery样式操作、click事件以及索引值-选项卡应用示例
2019/05/14 jQuery
js对象简介与基本用法示例
2020/03/13 Javascript
Python实现动态图解析、合成与倒放
2018/01/18 Python
OpenCV搞定腾讯滑块验证码的实现代码
2019/05/18 Python
Python OpenCV调用摄像头检测人脸并截图
2020/08/20 Python
Python解释器及PyCharm工具安装过程
2020/02/26 Python
python多维数组分位数的求取方式
2020/03/03 Python
Python 通过监听端口实现唯一脚本运行方式
2020/05/05 Python
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
总经理职责范文
2013/11/08 职场文书
教师应聘个人求职信
2013/12/10 职场文书
春节活动策划方案
2014/01/24 职场文书
开学典礼决心书
2014/03/11 职场文书
关于九一八事变的演讲稿2014
2014/09/17 职场文书
导游词之南京栖霞山
2019/10/18 职场文书