python3爬虫学习之数据存储txt的案例详解
作者:s_kangkang_A 发布时间:2022-01-17 05:02:09
上一篇实战爬取知乎热门话题的实战,并且保存为本地的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去掉不要的内容
二:作者与标题或内容不符
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函数处理
三:我们可以发现,这些内容是很长的:
这样,我们获取的内容是不正常的,我们分析可以找到该话题对应的链接,我们加上域名就可以到这个话题的详情页
我们获取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,数据库的相关博客续上。
运行结果:
另,注释代码都是测试代码,可以参考。
补充:可能看得时候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的案详解整合网站的支持!
来源:https://blog.csdn.net/s_kangkang_A/article/details/89061927
猜你喜欢
- 本文实例讲述了js控制div弹出层实现方法。分享给大家供大家参考。具体分析如下:这是个功能很好,且容易调用和控制的弹出层。感兴趣的朋友可以调
- 如果我需要在运行有SQL Server的机器上运行病毒扫描软件,怎样做才不会影响性能? 这取决于您希望运行的病毒扫描软件的类型。目前有三种类
- 一、描述在利用django做网络开发的时候我们会遇到一个问题就是,我们建立了多张数据表,但是多张数据表中的内容是不一样的,但是之间有着联系比
- 一、基本概念查找(Searching)就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找表(Search
- 一、修改表格数据类型 DataFrame 列的顺序实战场景:Pandas 如何修改表格数据类型 DataFrame 列的顺序1.1
- 当然是可以的,而且非常简单,今天就教大家在ASP中不用模板生成HTML静态页的方法。这里假设有一个htmer.asp动态页面,你想把它生成为
- 前言相信各位一定有收到过这样的群发短信,据说还被归类为玩转微信的五大技巧之一╮(╯▽╰)╭但,其实,只要跑一下脚本,就轻松找出删除自己的好友
- 一,斑马线的数据集数据集的构成:testtrainzebra corssing:56zebra corssing:168other:54ot
- 基本要点:程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改)每个对象都有一个身份、一个类型、一个值例: >&
- 下面就来介绍下SQL Server 2008中使用的端口有哪些:首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果我们要远程
- 传参时传递可变对象,实际上传的是指向内存地址的指针/引用这个标题是我的结论,也是我在做项目过程查到的。学过C的都知道,函数传参可以传值,也可
- 对于大多数web应用来说,数据库都是一个十分基础性的部分。如果你在使用PHP,那么你很可能也在使用MySQL—LAMP系列中举足轻重的一份子
- 最近需要做集团的SRC系统。暂无安全研发,所以只能找我这个小菜兼职开发。系统使用Django框架,在整个过程中,有许多奇特的需求。在某项需求
- 具体方法:1使用panda read_excel 方法加载excel2使用concat将DataFrame列表进行拼接3然后使用pd.Exc
- 这个翻滚代码没有使用什么marquee或者其它位移方法,而是每隔一秒把列表最顶端的那个li删掉,把这个li里面的内容插入到最底端新生成的li
- 准备工作去年的时候,青云发表过关于栅格系统的文章 . 我们知道网页的栅格系统是运用固定的格子设计版面布局,使其风格工整简洁. 视觉上来说,栅
- 如下所示:# coding = GBKa =[1,2,3,4,5]sum=0b = len(a)print("这个数组的长度为:&
- 新手学习Python,之前在网上看见一位朋友写的40行Python代码搞定京东秒杀,想在淘宝上帮女朋友抢玩偶,所以就照猫画虎的写了下淘宝的秒
- python给数据加上高斯噪声一开始用MATLAB给数据加噪声很简单,就一句话:% 给数据加指定SNR的高斯噪声signal_noise =
- 1.首先在Pycharm Tools->Deployment->Configurations打开新建SFTP输入host: ip