Python中如何使用selenium编写知乎关键词爬虫并抓取钓鱼贴图片

demo

地址在这里 zhihu_fun Github,求 star !!!!

。。。嗯,其实也可以爬其他方面的东西,但是目前只支持抓图片,其实这不是我的本意,我是想抓技术方面的东西的,但是我同事想要看这个,所以我就先抓这些图片了。。。Python 菜鸟一枚,代码写的很烂,还望各位大神多多指教

为什么要用 Selenium ?

新版知乎部分页面用 React 重写了,必须得加载 JS ,很多加载啥的都需要点击,所以我就用到了 Selenium

为什么不用知乎 API ?

单纯的想写一个爬虫而已


Python中如何使用selenium编写知乎关键词爬虫并抓取钓鱼贴图片

34 回复

一百次点击,无人回复,干的漂亮。


要写一个知乎关键词爬虫抓钓鱼贴图片,用Selenium得先装好驱动。核心思路是模拟登录、搜索关键词、过滤钓鱼贴、提取图片链接。下面给个完整示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
import requests
import os

class ZhihuImageCrawler:
    def __init__(self):
        self.driver = webdriver.Chrome()  # 需要提前下载chromedriver
        self.wait = WebDriverWait(self.driver, 10)
        
    def login(self, username, password):
        """模拟登录知乎"""
        self.driver.get("https://www.zhihu.com/signin")
        
        # 点击密码登录
        self.wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, ".SignFlow-tab")
        )).click()
        
        # 输入账号密码
        self.driver.find_element(By.NAME, "username").send_keys(username)
        self.driver.find_element(By.NAME, "password").send_keys(password)
        
        # 点击登录
        self.driver.find_element(
            By.CSS_SELECTOR, ".Button.SignFlow-submitButton"
        ).click()
        
        time.sleep(3)  # 等待登录完成
        
    def search_keyword(self, keyword):
        """搜索关键词"""
        search_input = self.wait.until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, ".SearchBar-input input")
        ))
        search_input.clear()
        search_input.send_keys(keyword)
        search_input.send_keys(Keys.RETURN)
        
        # 切换到"回答"标签页
        self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//div[text()='回答']")
        )).click()
        
        time.sleep(2)
        
    def extract_fishing_posts(self, max_scroll=5):
        """提取钓鱼贴内容,通过特定关键词识别"""
        fishing_keywords = ['钓鱼', '骗局', '诈骗', '上当']
        image_urls = []
        
        for _ in range(max_scroll):
            # 获取当前页面的所有回答卡片
            cards = self.driver.find_elements(By.CSS_SELECTOR, ".List-item")
            
            for card in cards:
                try:
                    content = card.text
                    # 判断是否为钓鱼贴
                    if any(keyword in content for keyword in fishing_keywords):
                        # 提取图片
                        images = card.find_elements(By.TAG_NAME, "img")
                        for img in images:
                            src = img.get_attribute("src")
                            if src and "http" in src:
                                image_urls.append(src)
                except:
                    continue
            
            # 滚动加载更多
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            time.sleep(2)
            
        return list(set(image_urls))  # 去重
    
    def download_images(self, urls, save_dir="zhihu_images"):
        """下载图片到本地"""
        if not os.path.exists(save_dir):
            os.makedirs(save_dir)
            
        for i, url in enumerate(urls):
            try:
                response = requests.get(url, timeout=10)
                if response.status_code == 200:
                    # 提取图片格式
                    ext = url.split('.')[-1].split('?')[0]
                    if len(ext) > 4:
                        ext = 'jpg'
                    
                    filename = f"{save_dir}/image_{i}.{ext}"
                    with open(filename, 'wb') as f:
                        f.write(response.content)
                    print(f"已下载: {filename}")
            except Exception as e:
                print(f"下载失败 {url}: {e}")
    
    def run(self, keyword, username=None, password=None):
        """主运行函数"""
        try:
            if username and password:
                self.login(username, password)
            
            self.search_keyword(keyword)
            image_urls = self.extract_fishing_posts(max_scroll=3)
            
            print(f"找到 {len(image_urls)} 张图片")
            if image_urls:
                self.download_images(image_urls)
                
        finally:
            self.driver.quit()

# 使用示例
if __name__ == "__main__":
    crawler = ZhihuImageCrawler()
    
    # 如果需要登录就传账号密码
    crawler.run(
        keyword="网络诈骗",
        # username="your_username",
        # password="your_password"
    )

几个关键点:

  1. 需要先安装seleniumrequestspip install selenium requests
  2. 下载对应Chrome版本的chromedriver
  3. 钓鱼贴识别逻辑可以自定义关键词列表
  4. 知乎页面结构可能变化,需要适时调整CSS选择器

注意控制请求频率,避免被封IP。图片下载做了去重和格式处理,保存到本地文件夹。

总结:用Selenium模拟操作,通过关键词过滤钓鱼贴,提取图片链接下载。

厉害了

营养跟不上啊…农村人还是在 B 乎上 Block 这些话题吧

提醒:_b 去掉试试😏

哇,去掉了,发现更大的世界

楼主 66666

star 已送

这必须赞一波

已 star ,过了不到一个小时开始非常慢了,难道是把知乎扒光了?

按照关键字搜帖子的时候,发现很多帖子里面的图片都是无关的。 好奇怎么过滤的

让我想起了知乎上这个收藏 https://www.zhihu.com/collection/60771406 (大胸妹子 - 收藏夹 - 知乎)

你配置文件中的 url_generate_time 设置为多少,默认为 30s ,意味着爬问题只爬 30s, 剩下的就是怕回答中的图片,我爬了 20 多 g 了,设置为 None 就可以一直爬下去。。

这个的话,我并没有做,但是可以经爬下来之后做图像识别啥的,嗯,比较高端

很好,收藏了

#12 设置都是默认值

嗯,你设置 url_generate_time 为 None 就能一直爬了,我已经爬了 22G 了。。。

估计能扒到 nfsw 这类管理员来不及删的东西

可以搞个深度 CNN 分类器啦(雾)

感觉太高端了。。。

知乎不做 ip 限次?

好像没有。。。

已 S&F

先 mark ,回去 star

哎家里穷,不要发这样的照片

实践出真知!

专门抓大腿的

也可以抓其他东西啊,嘿嘿

再配合某云服务的图片鉴黄 api ,就完美了。。。

很好,已经 star

道友想法很不错啊 我也在微博爬呢-。-
https://github.com/airbasic/weibo_album_spider

改改我去爬 tumblr :)

支持楼主

感谢楼主,妹子到手了
感谢,哈哈

回到顶部