面向 AI 的编程 -- 爬虫实战:爬取某乎粉丝

写在前面

遵循着三天打鱼两天晒网的准则, leetcode 刷题在周末暂且休息一下,来写个爬虫玩玩

本文发布已经知乎用户- 稳重 许可

Motivation:

一个同学的文章太厉害了,同学们几乎都是他的粉丝,借由大家在假期都回到了自己的 IP 地址之地,我们只需要知道同学的出生地就能“盒”到账号

尝试使用 request

爬虫最简单的应该也就是直接用 request 和 BeautifulSoup 了吧

分析网页结构

要爬取的是处于 div class="css-1gomreu" 中的元素,以此编写以下代码

def get_user():
    url='https://www.zhihu.com/people/wen-zhong-16-88/followers?page=2'
   
    response = requests.get(url)
    soup = BeautifulSoup(response.text,'html.parser')
    elements = soup.find_all('css-1gomreu')
    PRINT(elements)

但怎么只打印了个空方框!怎么回事?

再打印一下 status_code. 好! 200 没有问题

接着一步一步往上排查,让我们打印一下 response.text

不对啊,这是能跑出来的,那是 find 操作有问题吗?Ctrl+F 让我搜搜有没有 css-1gomreu :

0 result!难道我被反爬了吗,加上 cookie 什么的再看看?

def get_user():
    url='https://www.zhihu.com/people/wen-zhong-16-88/followers?page=2'

    headers = {
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
        "Cookie": "略"
        ,"X-Zse-93":"略"
        ,"X-Zse-96":"略"
        ,"X-Zst-81":"略"
    }

    response = requests.get(url,headers=headers)

好!还是没有搜出来!(后续以为是在同一 url 中有请求 再加了params ,亦无果)

那就让我们把打印出来的 response.text 直接放浏览器里好了

结果也是非常 Amazing 啊!除了我想要的元素以外都显示出来了

(这是在没用 headers 的情况,用了显示的就是 3 秒后跳转知乎首页了)

此时把 QQ 状态改成 emo 中,先歇一下


尝试使用 selenium

考虑到使用 request 还是蛮抽象的,毕竟也是看不见摸不着,让我们直接调一个浏览器看看吧

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("https://www.zhihu.com")

time.sleep(30)
driver.get("https://www.zhihu.com/people/wen-zhong-16-88/followers?page=3")
time.sleep(600)
driver.quit()

(尝试过写登录模块,但检索不到【密码登录】,还是留 30 秒自己来登算了),可以得到以下画面

结果也是非常的神奇,后面索性将 url 改为官网,想看看是不是应该一步一步跳转才行,发现结果是一致

顿时想到我在想着拿爬虫抢课时许佬和我讲的一句话

“你都上 selenium 了,怎么不直接写脚本”


Javascript 脚本实现寻找特定 html

那就写!当然读者可能会疑惑,标题中的“面向 AI ”到底在何处还未露面?就在此处

鉴于网上对 js 脚本的课程较少,直接上 ChatGPT

http://www.poe.com/ChatGPT 

(未用官网是因为懒)

寻找特定元素

如何写js脚本查找所有在某个class中的元素

 要编写一个 JavaScript 脚本来查找在特定类别(class)中的所有元素,可以使用 `document.getElementsByClassName()` 方法。这个方法可以通过类名获取文档中所有具有相同类名的元素。

以下是一个示例脚本,它将查找具有指定类名的所有元素,并将它们打印到控制台:

// 获取所有具有指定类名的元素
var elements = document.getElementsByClassName('your-class-name');

// 遍历所有找到的元素并打印它们
for (var i = 0; i < elements.length; i++) {
  console.log(elements[i]);
}

在上面的代码中,将 `your-class-name` 替换为你要查找的类名。这个脚本将返回一个 HTMLCollection 对象,其中包含了匹配的所有元素。然后,使用一个循环遍历这个集合,并使用 `console.log()` 将每个元素打印到控制台。

但其实我也不知道这东西打印到哪里,于是我想着用 alert 实现 ,再加上每 5 秒执行一次(这样的想法显然是来源于抢课,不过其实是因为要等待 html 加载完毕,而我不知道等待加载完毕的 js 怎么写)

我希望你写一个js脚本,每5秒查找一次网页上class为css-1gomreu的元素并用alert打通知,如果查找不到就发通知说没找到

当然,我可以为您编写这样的 JavaScript 脚本。请注意,由于我是一个纯文本模型,无法直接在浏览器中执行 JavaScript。我将提供一个示例代码,您可以将其复制到您的项目中并在浏览器中运行。

function checkElement() {
  var element = document.querySelector('.css-1gomreu');
  if (element) {
    alert('找到了!');
  } else {
    alert('未找到!');
  }
}

setInterval(checkElement, 5000);

 这段代码定义了一个 checkElement 函数,它使用 document.querySelector 方法查找网页上具有 css-1gomreu 类名的元素。如果找到该元素,它将使用 alert 弹出一个提示框,显示 "找到了!";如果未找到,它将显示 "未找到!"。

然后,我们使用 setInterval 函数每隔 5 秒调用一次 checkElement 函数,以实现每5秒钟检查一次。

请确保将此代码放在您的网页的 <script> 标签中,以便在加载页面时执行脚本。

找到了的话,打印所有的element到alert里 

function checkElement() {
  var elements = document.querySelectorAll('.css-1gomreu');
  if (elements.length > 0) {
    var elementList = '';
    for (var i = 0; i < elements.length; i++) {
      elementList += elements[i].outerHTML + '\n';
    }
    alert('找到了以下元素:\n\n' + elementList);
  } else {
    alert('未找到!');
  }
}

setInterval(checkElement, 5000);

 (上图已略去其他描述的话)但接下来打印的元素中就较为繁琐

唉,没关系,起码是找到了;不过,由上图我们可以发现,如果把 class 检索改为 UserLink-link ,可以得到更简略的信息;至此完成第一步:寻找到特定 html

下载 html 
function checkElement() {
var elements = document.querySelectorAll('.UserLink-link');
if (elements.length > 0) {
var elementList = '';
for (var i = 0; i < elements.length; i++) {
elementList += elements[i].outerHTML + '\n';
alert(elements[i].outerHTML);

}
//alert('找到了以下元素:\n\n' + elementList);
} else {
alert('未找到!');
}
}

setInterval(checkElement, 5000);

如何把获取到的 Element下载到一个文档中

 

// 将元素列表写入文本文件
    var fileContent = '找到了以下元素:\n\n' + elementList;
    var blob = new Blob([fileContent], { type: 'text/plain' });
    var fileName = 'elementList.txt';
    
    // 创建一个虚拟链接并下载文件
    var link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();

 接下来,我们只需要对每一页的粉丝都运行一下这个脚本,我们就可以下载到含有所有粉丝的数据了(此处应该可以批量处理,但我想了一下对完全不会的我来说,还是自己下更快点)

使用 BeautifulSoup 处理

接下来就是对文本批量处理,首先由以下指令得到文件名总汇

file_names = ['elementList ({}).txt'.format(i) for i in range(1, 28)]
print(file_names)

接下来,我们要做的事情就是首先访问粉丝的主页,再由主页信息的 IP 进行筛选(此处以江苏举例)

我得到一份文档,如何使用request访问文档中href后的网址,并且满足,访问的网址的html中如果含有“江苏”,返回网址

 

keyword = "属地江苏"

for link in links:
    href = link.get('href')
    
    # 检查链接是否存在
    if href:
        # 使用requests访问链接
        response = requests.get(href)
        
        # 检查响应状态码
        if response.status_code == 200:
            # 检查网页内容是否包含关键字
            if keyword in response.text:
                print("满足条件的链接:", href)

但此时出现报错:1-编码错误;2-网址以“ // ”开头,无法访问,做一些调整

#加上
href = "https:"+link.get('href')

#with open('your_document.html', 'r') as file: 改为
with open('elementList (1).txt', 'r', encoding='utf-8') as file:

再有最后一步:筛选出网址后返回用户名,我们注意到在源 html 中用户名如此实现

<div class="ProfileHeader-contentHead"><h1 class="ProfileHeader-title"><span class="ProfileHeader-name">示例用户名<style da

根据 GPT 回复,如此即可

username_match = re.search('<span class="ProfileHeader-name">(.+?)<', response.text)
username = username_match.group(1)

其实每个用户的链接会出现两次,为此我们创建一个全局变量即可,再将所有 html 文件放到与程序相同文件夹,执行以下程序

from bs4 import BeautifulSoup
import requests
import re
num=0
file_names = ['elementList.txt', 'elementList (1).txt', 'elementList (2).txt', 'elementList (3).txt', 'elementList (4).txt', 'elementList (5).txt', 'elementList (6).txt', 'elementList (7).txt', 'elementList (8).txt', 'elementList (9).txt', 'elementList (10).txt', 'elementList (11).txt', 'elementList (12).txt', 'elementList (13).txt', 'elementList (14).txt', 'elementList (15).txt', 'elementList (16).txt', 'elementList (17).txt', 'elementList (18).txt', 'elementList (19).txt', 'elementList (20).txt', 'elementList (21).txt', 'elementList (22).txt', 'elementList (23).txt', 'elementList (24).txt', 'elementList (25).txt', 'elementList (26).txt', 'elementList (27).txt']



for file_name in file_names:
    with open(file_name, 'r', encoding='utf-8') as file:
        # 使用BeautifulSoup解析文档
        document_content = file.read()
        soup = BeautifulSoup(document_content, 'html.parser')

        # 提取所有链接
        links = soup.find_all('a')
        keyword = "属地江苏"

        for link in links:
            href = "https:" + link.get('href')

            # 检查链接是否存在
            if href:
                # 使用requests访问链接
                response = requests.get(href)

                # 检查响应状态码
                if response.status_code == 200:
                    # 检查网页内容是否包含关键字

                    if keyword in response.text:
                        num+=0.5
                        if(num%1==0):
                            username_match = re.search('<span class="ProfileHeader-name">(.+?)<', response.text)
                            username = username_match.group(1)
                            print("满足条件的链接:", href, "第", int(num), "个,名字是", username)

即可得到结果

Q.E.D. 

(本人非计算机专业学生,并不熟悉 Javascript 的具体操作,对 Python 也不精通,在实现过程中难免走了弯路,望大佬轻喷。如果认为该行为侵犯到了您的权益,请联系作者删除)

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 好的,首先你需要准备一台电脑,并在电脑上安装好Python环境。然后,你可以使用Python中的网络爬虫库来电影信息。 网络爬虫库是一种用于从网站上信息的工具,常用的网络爬虫库有Beautiful Soup和Scrapy。 下面是使用Beautiful Soup库来电影信息的示例代码: ``` import requests from bs4 import BeautifulSoup # 设置要的网站地址 url = "https://www.example.com/movies" # 发送请求,获网站的HTML代码 response = requests.get(url) html = response.text # 使用Beautiful Soup解析HTML代码 soup = BeautifulSoup(html, "html.parser") # 查找所有电影的信息 movies = soup.find_all("div", class_="movie") # 遍历每部电影,输出电影名称和导演 for movie in movies: name = movie.find("h2").text director = movie.find("p").text print(name + " " + director) ``` 在上面的代码中,我们首先使用`requests`库发送网络请求,获网站的HTML代码,然后使用`BeautifulSoup`解析HTML代码,最后查找所有电影的信息,并遍历每部电影,输出电影名称和导演。 希望这些信息能帮助到你。 ### 回答2: 当然可以通过Python来编写一个智能AI电影信息。 首先,你需要使用Python中的Web爬虫框架如`Requests`或`urllib`来获电影网站上的页面内容。通过发送HTTP请求,获到电影网站相关页面的HTML代码。 然后,你可以使用Python库如`BeautifulSoup`来对获到的HTML代码进行解析和提。通过分析网页结构,你可以提出电影的相关信息,如电影名称、导演、演员等。 接着,你可以使用正则表达式或其他字符串处理方法来进一步精确提需要的信息,如电影评分、上映日期等。 为了增加智能AI的功能,你可以使用自然语言处理的库如`NLTK`来处理电影的剧情简介、评论等文本内容。通过分词、词性标注、情感分析等技术,你可以获得更多有关电影的语义信息。 除了电影信息,你还可以使用Python来构建一个用户交互界面,使智能AI能够根据用户的选择和需求进行电影推荐。你可以使用Python中的GUI框架如`Tkinter`或`PyQt`来实现这样的界面。 最后,你可以将到的电影信息和AI的功能整合起来,使智能AI能够根据用户的输入和需求,智能地搜索、推荐和展示电影信息。 希望这些简单的步骤能帮助你开始用Python实现一个智能AI电影信息! ### 回答3: 当然可以用Python来实现一个智能AI电影信息。首先,你需要使用Python的爬虫库,比如requests和BeautifulSoup来获网页的内容和解析HTML。然后,你可以选择一个可靠的电影网站作为数据源,比如IMDB或豆瓣电影,使用爬虫库来获电影的相关信息,如电影名称、评分、演员等等。你可以通过解析网页的HTML结构来提这些信息。 接下来,你可以使用Python的数据处理和分析库,比如pandas和numpy来处理这些电影数据。你可以清洗数据,去掉重复项,将数据转换为合适的格式,以便后面的分析和使用。 然后,你可以使用Python的机器学习库,如scikit-learn或TensorFlow来构建智能AI模型。你可以使用这些库来训练一个分类器或推荐系统,根据电影的特征来预测用户的喜好或推荐相关电影。 最后,你可以使用Python的Web开发框架,如Django或Flask来构建一个网站或应用程序,将你的智能AI与用户交互。用户可以通过输入关键词或条件来查询电影,你的AI可以通过分析用户的输入,提供符合用户偏好或条件的电影推荐。 总的来说,你可以利用Python的爬虫、数据处理、机器学习和Web开发的功能来实现一个智能AI电影信息,并根据用户的需求提供个性化的电影推荐。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值