吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17474|回复: 79
收起左侧

[Python 转载] python 爬取知乎盐选文章内容

  [复制链接]
楚子沦i 发表于 2020-11-27 21:19
本帖最后由 楚子沦i 于 2020-12-28 22:08 编辑

有人留言说看不懂。。。简单说一下吧,首先要学点python吧,其次要学一下关于requests_html以及requests吧,然后再学一下beautifulsoup和re。
相关的教程其实非常多了,requests_html的教程可以看:https://zjzdmc.top/jsfx/47.html
不过其实大多数的教程百度都是有的,直接百度搜索即可。如有有什么不会的可以留言或者私信我,我其实也会的不多,大家一起学习一起进步。
image.png


来论坛很久了,一直在看大佬们发的帖子,自己却没什么贡献,所以今天准备在这个版块做下贡献。
最近在看知乎盐选,然后有的文章确实写的很不错,不过大多数都是需要vip的然后来论坛看有没有现成的资源。
发现很多人都在求资源并且求得都不是我想要的
所以自己开了个盐选会员,1.8开了8天。
然后呢就想为论坛里的兄弟们做下贡献,但是发现挨个复制太麻烦了,所以就有了这篇文章。
看过前面文章的朋友,肯定都知道我最近在看python这一块的内容,然后既然看了python那么就不得不看一下python最火爆的一个功能,爬虫。
然后呢,最近又正好看了几篇知乎盐选的文章,所以就想试试手,把文章内容爬取下来,但是一开始还好说。
直接用requests_html就能爬下来,但是后免得内容就需要开会员才能爬了,但是主要就是我开了会员呀。所以就找了一下关于python爬虫模拟登录的代码,发现大部分的都是比较麻烦的,而我又比较懒,并且昨天还发烧了,所以就找了一个简单的方法,使用别人的开源库。DecryptLogin这个库是一个开源的模拟登陆的库,目前支持许多的网站模拟登陆了,所以就决定使用这个进行测试。
from DecryptLogin import login
首先呢先把库导入进去,然后通过内置的函数进行模拟登陆。
lg = login.Login()
_, loginstauts = lg.zhihu(username='', password='', mode='pc')
然后模拟登录,发现可行,于是就决定使用这个库来进行模拟登陆了。
但是没想到我当时以为离成功就差一步的时候,现实给我来了一记头槌,使用xpath一直获取不到内容,然后库给的示例发现并不是很能看懂,顶多看个意思,然后自己尝试发现并不可行,不是这个错误就是那个错误。
之后呢,本来以为要在这里卡很久的我,突然在下午的时候想到了去看这个库的代码,看看里面都调用了什么内容。
import requests
没想到调用了requests库,这下好办了,直接使用requests库的方法就行了。headers = {    'user-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"}这个是设置一下useragent,之后只需要请求一下数据即可
url2 = "https://www.zhihu.com/market/paid_column/1178733193687175168/section/1178742849583083520"
r = loginstauts.get(url2, headers=headers)
wenzi = r.text
之后我们直接.text就能获取html页面的所有内容了,不过很明显,带着各类html标签的内容不是我们想要的,我一开始都是用的requests_html,本来还以为requests有xpath功能呢,没想到并没有,一开始看都推荐的是
from lxml import etree这个,但是我比较想找一个简单的,所以百度一查发现了
from bs4 import BeautifulSoup这个,很nice。soup = BeautifulSoup(wenzi, 'lxml', from_encoding='utf8')texts = soup.find_all('p')for text in texts:    print(text.get_text())这样我们就能读取所有的内容了,不过其实当时还遇到了一个问题,就是使用find_all这个方法之后使用.string属性的话,获取到的内容为none百度查过大部分人说是因为有br标签,但是自己也看过并没有,所以并没有找到什么原因,后来在csdn的一篇文章里的评论看到了一个大佬说的.get_text()方法,换成这个没想到就出结果了,难以想象。其实看代码只是几行,但是确实是心血,哈哈。
毕竟中途也遇到了许多的问题,不过幸好大部分都解决了,没解决的也都有替换的方法。不过说真的,想要学习编程还是需要有一个好的环境,毕竟在学习的路上会遇到很多的问题,如果百度没查到,那么就需要去查论坛,去提问,去询问了。


没想到我在写草稿的时候,就把进阶给想出来了,不过其实这个进阶应该很容易想出来,就是通过一个链接来获取其余内容的链接。
[Python] 纯文本查看 复制代码
from DecryptLogin import login
from bs4 import BeautifulSoup
import re
import base64
lg = login.Login()
_, loginstauts = lg.zhihu(username='', password='', mode='pc')
headers = {
    'user-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
}
url1 = "https://www.zhihu.com/market/paid_column/1178733193687175168/section/1178742737682350080"
url2 = "https://www.zhihu.com/market/paid_column/1178733193687175168/section/1178742849583083520"
# 获取链接
r = loginstauts.get(url1, headers=headers)
wenzi = r.text
soup = BeautifulSoup(wenzi, 'lxml')
lianjie = soup.textarea
lianjie = str(lianjie)
pattern = re.compile('"next_section":{"url":"(.+)","is_end":') #正则匹配链接所在的文字
result = pattern.findall(lianjie)
texts = soup.find_all('p')
for text in texts:
    with open("yanxuan.txt", 'a', encoding='utf-8') as file_object:
        file_object.write(text.get_text()+" ")
list = result.pop(0)
print(list)
for link in range(0, 9):
    r2 = loginstauts.get(list, headers=headers)
    wenzi = r2.text
    soup = BeautifulSoup(wenzi, 'lxml')
    lianjie = soup.textarea
    lianjie = str(lianjie)
    pattern = re.compile('"next_section":{"url":"(.+)","is_end":')  # 正则匹配链接所在的文字
    result = pattern.findall(lianjie)
    list = result.pop(0)
    texts = soup.find_all('p')
    for text in texts:
        with open("yanxuan.txt", 'a', encoding='utf-8') as file_object:
            file_object.write(text.get_text()+" ")
        # print(text.get_text())
 
# print(list)
# r2 = loginstauts.get(list, headers=headers)
# wenzi2 = r2.text
# soup2 = BeautifulSoup(wenzi2, 'lxml')

这就是进阶的代码了,就是通过文章的第一个链接来继续获取其余连接的内容,不过还是有一些问题,比如说我循环的长度是通过我看目录看出来的,而不是自动得出的,不知道大佬看后有没有更好的办法呢?

免费评分

参与人数 12吾爱币 +12 热心值 +11 收起 理由
只有午安 + 2 + 1 真的刚好卡在这边了- - 感谢!!!有思路了
默默看着你 + 2 + 1 谢谢@Thanks!
soga + 1 + 1 谢谢@Thanks!
机器_ + 1 + 1 用心讨论,共获提升!
许小展 + 1 + 1 谢谢@Thanks!
fCd9H#TjlaMBPSa + 1 + 1 谢谢@Thanks!
fengmodel + 1 谢谢@Thanks!
银狐狸 + 1 我很赞同!
子杨呀! + 1 用心讨论,共获提升!
天涯89 + 1 + 1 虽然不会用,但是很感谢
LedZeppelin + 1 + 1 我很赞同!
sdlyfxjjc + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

  • · 源码|主题: 47, 订阅: 1

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| 楚子沦i 发表于 2020-11-28 17:04
senooo 发表于 2020-11-27 21:49
RuntimeError: 为了您的帐号安全,请使用短信验证码登录

绑定一下邮箱即可,或者将后面的代码更换一下
[Python] 纯文本查看 复制代码
lg = login.Login()
infos_return, session = lg.zhihu('', '', 'scanqr')
将mode="pc"换成scanqr就行了,这样就是扫码验证了

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
xlxx + 1 + 1 用心讨论,共获提升!

查看全部评分

senooo 发表于 2020-11-27 21:49
RuntimeError: 为了您的帐号安全,请使用短信验证码登录
计算机学习者 发表于 2020-11-27 21:36
麻了,绝了,我这送的知乎会员刚过期,hxd不提我都忘了
jiuairen 发表于 2020-11-27 21:37
萌新表示看不懂
lefttrammel 发表于 2020-11-27 22:07
顿一个大佬言论的出现
zhangran881 发表于 2020-11-27 22:16
看起来是个大佬
天涯89 发表于 2020-11-30 21:11
期待成果呀
 楼主| 楚子沦i 发表于 2020-11-30 22:13

做出来了啊,你可以直接把代码复制上使用的。不过要改下模式,改成扫码登录,前面有个回复有怎么改。
天涯89 发表于 2020-12-2 12:38
那有空研究一下,非常感谢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 14:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表