python爬取知乎回答

1. 安装库

htmlparser用来解析html。

Beautiful Soup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库。

pip install beautifulsoup4

Selenium 是浏览器自动化测试框架,使用它来模拟用户操作。

利用 pip 安装 selenium

pip install -U selenium

2. 模拟用户进行滚动和点击操作

使用JS控制滚动条的位置:

window.scrollTo(x,y);

竖向滚动条置底

 window.scrollTo(0,document.body.scrollHeight)
 time.sleep(2)

向下滑动后延迟两毫秒等待页面加载。

在页面上通过审查,找到查看更多回答的html代码

<button class="Button QuestionMainAction"
type="button">查看更多回答</button>

通过

driver.find_element_by_css_selector('button.QuestionMainAction').click()

来选中并点击这个按钮。

3. html文件结构化

将html文件结构化并保存,原页面的html解析并存储下来

通过prettify()将html结构化,之后存储在本地的txt文件中。

4. 保存并下载图片

注意我们的目的,就是爬取回答下的图片,其他的都不需要。

还是右键审查,可以发现每张图片上面都有的node,没错,这里面存有图片的高清URL和缩略图URL。

每个元素都被html entity编码了,所以我们要将其解码如下。

html.parser.unescape

之后就可以将图片URL保存下来。

最后下载图片。

urllib.request.urlretrieve

5. 结果展示

6. 代码


from selenium import webdriver
import time

import urllib.request

from bs4 import BeautifulSoup

import html.parser

def main():
    driver = webdriver.Chrome()  # 打开浏览器
    driver.get("https://www.zhihu.com/question/40273344") # 打开想要爬取的知乎页面 

    # 模拟用户操作
    def execute_times(times):

        for i in range(times):
            driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(2)
            try:
                driver.find_element_by_css_selector('button.QuestionMainAction').click()
                print("page" + str(i))
                time.sleep(1)
            except:
                break

    execute_times(5)

    result_raw = driver.page_source  # 这是原网页 HTML 信息
    result_soup = BeautifulSoup(result_raw, 'html.parser')# 然后将其解析
    result_bf = result_soup.prettify()  # 结构化原 HTML 文件
    with open("./output/rawfile/raw_result.txt", 'w',encoding="utf-8") as girls:  # 存储路径里的文件夹需要事先创建。
        girls.write(result_bf)
    girls.close()
    print("爬取回答页面成功!!!")


    with open("./output/rawfile/noscript_meta.txt", 'wb') as noscript_meta:
        noscript_nodes = result_soup.find_all('noscript')  # 找到所有<noscript>node
        noscript_inner_all = ""
        for noscript in noscript_nodes:
            noscript_inner = noscript.get_text()  # 获取<noscript>node内部内容
            noscript_inner_all += noscript_inner + "\n"

        noscript_all = html.parser.unescape(noscript_inner_all).encode('utf-8')  # 将内部内容转码并存储
        noscript_meta.write(noscript_all)

    noscript_meta.close()
    print("爬取noscript标签成功!!!")

    img_soup = BeautifulSoup(noscript_all, 'html.parser')
    img_nodes = img_soup.find_all('img')
    with open("./output/rawfile/img_meta.txt", 'w') as img_meta:
        count = 0
        for img in img_nodes:
            if img.get('src') is not None:
                img_url = img.get('src')

                line = str(count) + "\t" + img_url + "\n"
                img_meta.write(line)
                urllib.request.urlretrieve(img_url, "./output/image/" + str(count) + ".jpg")  # 一个一个下载图片
                count += 1

    img_meta.close()
    print("图片下载成功")
if __name__ == '__main__':
    main()
全部评论

相关推荐

最近群里有很多同学找我看简历,问问题,主要就是集中在明年三月份的暑期,我暑期还能进大厂嘛?我接下来该怎么做?对于我来说,我对于双非找实习的一个暴论就是title永远大于业务,你在大厂随随便便做点慢SQL治理加个索引,可能就能影响几千人,在小厂你从零到一搭建的系统可能只有几十个人在使用,量级是不一样的。对双非来说,最难的就是约面,怎么才能被大厂约面试?首先这需要一点运气,另外你也需要好的实习带给你的背书。有很多双非的同学在一些外包小厂待了四五个月,这样的产出有什么用呢?工厂的可视化大屏业务很广泛?产出无疑是重要的,但是得当你的实习公司到了一定的档次之后,比如你想走后端,那么中厂后端和大厂测开的选择,你可以选择中厂后端(注意,这里的中厂也得是一些人都知道的,比如哈啰,得物,b站之类,不是说人数超过500就叫中厂),只有这个时候你再去好好关注你的产出,要不就无脑大厂就完了。很多双非同学的误区就在这里,找到一份实习之后,就认为自己达到了阶段性的任务,根本不再投递简历,也不再提升自己,玩了几个月之后,美其名曰沉淀产出,真正的好产出能有多少呢?而实际上双非同学的第一份实习大部分都是工厂外包和政府外包!根本无产出可写😡😡😡!到了最后才发现晚了,所以对双非同学来说,不要放过任何一个从小到中,从中到大的机会,你得先有好的平台与title之后再考虑你的产出!因为那样你才将将能过了HR初筛!我认识一个双非同学,从浪潮到海康,每一段都呆不久,因为他在不断的投递和提升自己,最后去了美团,这才是双非应该做的,而我相信大部分的双非同学,在找到浪潮的那一刻就再也不会看八股,写算法,也不会打开ssob了,这才是你跟别人的差距。
迷茫的大四🐶:我也这样认为,title永远第一,只有名气大,才有人愿意了解你的简历
双非本科求职如何逆袭
点赞 评论 收藏
分享
12-01 18:27
已编辑
湖南科技大学 后端工程师
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务