没想到进阶版来的这么快,在发布了python爬取知乎盐选文章内容后,没想到居然这么快就要更新新的内容了。
在下午思考第一篇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')

python 爬取知乎盐选全部内容
直接上一手代码,讲一下思路,首先先是获取文本内容,通过前面的文章,我们知道 了如何获取文本内容,并且明白了该怎么获取整个页面的html内容。
本来最初的想法是把目录里的每一个链接都复制下来,然后通过遍历来获取链接,因为我最初是真的没发现下一篇的链接是通过哪里获得的。然后今天下午的时候,认认真真(闲的蛋疼)的看了一下知乎盐选文章内容的源代码,发现原来跳转链接在他的底部textarea里,并且还是在里面的一个next_section里,让我一顿好找,不过找到就是最好的啦。

找到之后,我们只需要获取到跳转的链接即可了,只需要使用正则进行条件筛选就可以了。
pattern = re.compile('"next_section":{"url":"(.+)","is_end":') # 正则匹配链接所在的文字
result = pattern.findall(lianjie)

也就是这一段代码,我们对获取的内容进行匹配筛选,即可获得链接了,不过在获得之后,还是会出现一个问题,就是获取的内容会储存在列表里,我们还需要把列表的内容读取出来才能使用。本来其实最早我的思路是使用循环,然后把获取到的链接储存到同一个列表里,然后利用循环读取即可,但是因为当时脑子可能抽了,把变量的值给改错了,前面虽然该出来了,但是后面的都没改,就会得到一个很尴尬的结果,就是所有的结果都是同一个,然后我就换了种方法,没想到刚换就找到了问题所在。不过也懒得该回去了。通过列表的方法pop来对列表内容进行删除,并且将删除返回的值进行保存,然后当作一个数据进行储存。

也就是这一段的内容了

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())

其他的也就没有什么难度的东西了,不过如果有什么疑问,可以在评论区留下你的疑惑,我会在看到的第一时间进行回复的。

最后修改:2021 年 04 月 20 日 08 : 58 AM
如果觉得我的文章对你有用,请随意赞赏