歌者文明清理员 发表于 2023-4-8 13:11:01

selenium爬取论坛用户名

本帖最后由 歌者文明清理员 于 2023-4-17 10:54 编辑

谁来解释这串代码,我给谁最佳
from selenium import webdriver
from time import sleep
from lxml import html
from re import sub, compile


def login(email, password):
    option = webdriver.ChromeOptions()
    option.add_argument('headless')
    browser = webdriver.Chrome(options=option)
    browser.get('https://fishc.com.cn/member.php?mod=logging&action=login')
    sleep(1)
    browser.find_element('xpath', usernamex).send_keys(email)
    browser.find_element('xpath', passwordx).send_keys(password)
    browser.find_element('xpath', autologinx).click()
    browser.find_element('xpath', submitx).click()
    sleep(1)
    try:
      browser.find_element('id', 'succeedmessage_href').click()
      return browser.page_source
    except:
      raise
    finally:
      browser.close()


def get_username(source):
    tree = html.fromstring(source)
    username_source = html.tostring(tree.xpath(get_usernamex), encoding='unicode')
    username = sub(compile(r'<.*?>'), '', username_source)
    return username


usernamex = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/input'
passwordx = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/input'
submitx = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/button'
autologinx = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/label/input'

get_usernamex = '/html/body/div/div/div/div/p/strong/a'


def main():
    source = login('**********@qq.com', '****************')
    username = get_username(source)
    print(username)


if __name__ == '__main__':
    main()

isdkz 发表于 2023-4-8 13:16:38

这段代码的主要目的是使用Selenium库登录到一个网站(fishc.com.cn),并从网站上抓取并打印用户名。以下是详细的代码解释和注释:

# 导入所需的库
from selenium import webdriver
from time import sleep
from lxml import html
from re import sub, compile

# 定义登录函数,传入email和password作为参数
def login(email, password):
    # 设置Chrome浏览器的选项
    option = webdriver.ChromeOptions()
    # 添加无头模式(不显示浏览器界面)
    option.add_argument('headless')
    # 创建一个Chrome浏览器实例,使用上面的选项
    browser = webdriver.Chrome(options=option)
    # 打开登录页面
    browser.get('https://fishc.com.cn/member.php?mod=logging&action=login')
    # 等待1秒,确保页面加载完成
    sleep(1)
    # 在页面中找到用户名输入框,输入email
    browser.find_element('xpath', usernamex).send_keys(email)
    # 在页面中找到密码输入框,输入password
    browser.find_element('xpath', passwordx).send_keys(password)
    # 点击自动登录复选框
    browser.find_element('xpath', autologinx).click()
    # 点击提交按钮
    browser.find_element('xpath', submitx).click()
    # 再次等待1秒
    sleep(1)
    try:
      # 如果登录成功,点击跳转链接
      browser.find_element('id', 'succeedmessage_href').click()
      # 返回页面源代码
      return browser.page_source
    except:
      # 如果出现异常,抛出异常
      raise
    finally:
      # 关闭浏览器实例
      browser.close()

# 定义获取用户名的函数,传入网页源代码作为参数
def get_username(source):
    # 使用lxml库解析网页源代码
    tree = html.fromstring(source)
    # 使用XPath定位到用户名所在的元素,并获取其源代码
    username_source = html.tostring(tree.xpath(get_usernamex), encoding='unicode')
    # 使用正则表达式删除HTML标签,只保留文本内容
    username = sub(compile(r'<.*?>'), '', username_source)
    # 返回用户名
    return username

# 定义XPath路径,用于定位页面上的元素
usernamex = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/input'
passwordx = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/input'
submitx = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/button'
autologinx = '/html/body/div/div/div/div/div/div/div/form/div/div/table/tbody/tr/td/label/input'
get_usernamex = '/html/body/div/div/div/div/p/strong/a'

# 定义主函数
def main():
    # 调用登录函数,使用yhm和ww作为参数(这里需要替换为实际的用户名和密码)
    source = login(yhm, ww)
    # 调用get_username函数,传入网页源代码,获取用户名
    username = get_username(source)
    # 打印用户名
    print(username)

# 如果这个脚本是主程序,则运行主函数
if name == '__main__':
    main()


这个程序首先使用`login`函数,输入email和password作为参数,登录到fishc.com.cn网站。接着,调用`get_username`函数从登录后的页面源代码中抓取用户名。最后,`main`函数会打印用户名。在运行此代码时,请确保替换`yhm`和`ww`为实际的用户名和密码。

在这里,我们继续解释程序的关键部分。

1、main() 函数:这是程序的入口点。首先,它调用 login() 函数并传入用户名(yhm)和密码(ww),然后将返回的页面源代码保存在 source 变量中。接下来,它调用 get_username() 函数并传入页面源代码以获取用户名。最后,它打印出用户名。
请注意,在运行此脚本之前,您需要将 yhm 和 ww 替换为实际的用户名和密码。

2、if __name__ == '__main__'::这行代码是 Python 程序的常见结构,用于检查当前脚本是否作为主程序运行。如果是,则执行 main() 函数。这样做的目的是允许其他程序导入此脚本中的函数并在需要时调用它们,而不会在导入时自动执行 main() 函数。

总结一下,这个程序的主要功能是自动登录 fishc.com.cn 网站并从登录后的页面上抓取并打印出用户名。它通过使用 Selenium WebDriver 自动化浏览器操作,以及利用 lxml 库和正则表达式解析页面源代码来实现这一目标。在运行此程序之前,请确保正确安装了所有必需的库,并将用户名和密码替换为实际值。

歌者文明清理员 发表于 2023-4-8 13:24:27

本帖最后由 歌者文明清理员 于 2023-4-8 13:25 编辑

isdkz 发表于 2023-4-8 13:16
这段代码的主要目的是使用Selenium库登录到一个网站(fishc.com.cn),并从网站上抓取并打印用户名。以下是 ...

你的AI真厉害,我不写注释都能看懂
我有个疑问,你是不是告诉过AI关于fishc的一些事情啊,不然怎么可能说得这么清楚

isdkz 发表于 2023-4-8 13:25:46

接下来,我会对程序中的每个部分进行更详细的解释。

1、导入库: 首先,程序需要导入一些必要的库来处理网页抓取和解析。


[*]selenium: 用于自动化浏览器操作。
[*]webdriver: 从 Selenium 库中导入,用于创建和操作浏览器实例。
[*]time.sleep: 用于在程序中引入等待时间,以确保页面加载完成。
[*]lxml.html: 用于解析 HTML 页面源代码。
[*]re.sub 和 re.compile: 用于执行正则表达式操作,以便从 HTML 代码中提取所需的文本。


2、login(email, password) 函数: 这个函数的目的是通过自动化浏览器操作实现用户登录。它接收两个参数,即用户的 email 和 password。


[*]函数首先创建一个 webdriver.ChromeOptions() 实例,用于配置 Chrome 浏览器的选项。
[*]使用 option.add_argument('headless') 将浏览器设置为无头模式,即不显示浏览器界面。
[*]接下来,使用配置好的选项创建一个新的 Chrome 浏览器实例。
[*]使用 browser.get() 打开 fishc.com.cn 的登录页面。
[*]为了确保页面完全加载,程序暂停 1 秒。
[*]然后,程序在页面中找到用户名和密码输入框,并输入相应的 email 和 password。
[*]接着,程序点击自动登录复选框和提交按钮,以完成登录过程。
[*]在登录完成后,程序再次等待 1 秒,以确保页面已跳转。
[*]接下来,程序尝试查找一个特定的页面元素(succeedmessage_href)。如果找到该元素,说明登录成功,程序将点击该链接并返回页面源代码。如果找不到该元素,则抛出异常。
[*]最后,在 finally 子句中,程序关闭浏览器实例。


3、get_username(source) 函数: 该函数的目的是从登录后的页面源代码中提取用户名。它接收一个参数,即页面源代码。


[*]首先,使用 html.fromstring() 函数将源代码转换为 lxml 库可以操作的格式。
[*]接着,使用 XPath 表达式(get_usernamex)定位到用户名所在的元素,并获取其 HTML 代码。
[*]然后,使用 re.sub() 和 re.compile() 函数删除 HTML 代码中的所有标签,只保留纯文本内容,即用户名。
[*]最后,返回提取到的用户名。


4、XPath 变量: 这些变量包含了在 HTML 页面中定位元素所需的 XPath 表达式。

5、main() 函数: 这是程序的主要执行部分。首先,它调用 login() 函数并传入用户名(yhm)和密码(ww)进行登录。登录成功后,login() 函数将返回登录后页面的源代码。然后,main()函数调用get_username() 函数并传入源代码以提取用户名。最后,main() 函数打印出提取到的用户名。

6、if __name__ == '__main__'::这是 Python 程序的一个典型结构,用于检查当前脚本是否作为主程序运行。如果是,则执行 main() 函数。这样做的目的是允许其他程序导入此脚本中的函数并在需要时调用它们,而不会在导入时自动执行 main() 函数。


在运行此脚本之前,请确保已安装所有必需的库,如 Selenium、ChromeDriver 和 lxml。此外,请务必将 yhm 和 ww 变量替换为实际的用户名和密码。运行脚本后,程序将自动登录 fishc.com.cn 网站,从登录后的页面上抓取用户名,并将其打印到控制台。


总之,这个 Python 程序通过结合 Selenium WebDriver(用于自动化浏览器操作)以及 lxml 库(用于解析 HTML 页面源代码)和正则表达式(用于从 HTML 代码中提取文本内容)实现了自动登录 fishc.com.cn 网站并抓取用户名的功能。在使用该程序时,请确保将用户名和密码替换为实际值,并确保已安装所有必需的库。

isdkz 发表于 2023-4-8 13:27:24

歌者文明清理员 发表于 2023-4-8 13:24
你的AI真厉害,我不写注释都能看懂
我有个疑问,你是不是告诉过AI关于fishc的一些事情啊,不然怎么可 ...

没有告诉他什么呀,我就直接复制你的代码过去,让它给出详细的注释和解释

现在的 chatgpt 的理解能力还是可以的

歌者文明清理员 发表于 2023-4-8 13:27:53

isdkz 发表于 2023-4-8 13:25
接下来,我会对程序中的每个部分进行更详细的解释。

1、导入库: 首先,程序需要导入一些必要的库来处理 ...

在登录完成后,程序再次等待 1 秒,以确保页面已跳转
说的不对,是等待登录完成
接下来,程序尝试查找一个特定的页面元素(succeedmessage_href)。如果找到该元素,说明登录成功,程序将点击该链接并返回页面源代码。如果找不到该元素,则抛出异常。
也不对,succed_message_href是“如果您的浏览器没有自动跳转,请点击此链接”。报错是用户名和密码输入错误

歌者文明清理员 发表于 2023-4-8 13:28:51

isdkz 发表于 2023-4-8 13:27
没有告诉他什么呀,我就直接复制你的代码过去,让它给出详细的注释和解释

现在的 chatgpt 的理解能力 ...

奇怪,chatgpt 研究过 fishc?

isdkz 发表于 2023-4-8 13:35:23

歌者文明清理员 发表于 2023-4-8 13:28
奇怪,chatgpt 研究过 fishc?

也不是,他就像算命的一样,如果你没有给它足够的信息,它就往宽泛了讲,让你觉得头头是道,

如果你给了它足够的信息,它就给你精细的解释,就像柯南一样掌握了所有的线索,那么真相只有一个,所以它的犯错率就降的很低

比如让它解释你这个代码,它都是根据你的变量名和函数名等等线索来判断语义的,如果你的变量名和函数名毫无规律可言,比如 a、b、c 这些没有准确语义的字母,那 chatgpt 就没法给你那么准确的解释,而且可能就是纯纯的一本正经胡说八道

歌者文明清理员 发表于 2023-4-8 13:40:11

isdkz 发表于 2023-4-8 13:35
也不是,他就像算命的一样,如果你没有给它足够的信息,它就往宽泛了讲,让你觉得头头是道,

如果你给 ...

因为chatgpt的代码是从github拿来训练的
因此推出:github上有selenium登录某论坛(很可能是基于discuz的论坛)的例子!更可能是,GitHub上有一些鱼油暴露了这个论坛的存在

isdkz 发表于 2023-4-8 13:44:31

歌者文明清理员 发表于 2023-4-8 13:40
因为chatgpt的代码是从github拿来训练的
因此推出:github上有selenium登录某论坛(很可能是基于discuz ...

这个大语言模型它不是一定要接触过才懂呀

只要符合人类语言的通性它就能理解出其含义

歌者文明清理员 发表于 2023-4-8 13:58:05

isdkz 发表于 2023-4-8 13:44
这个大语言模型它不是一定要接触过才懂呀

只要符合人类语言的通性它就能理解出其含义

哎,我可以把email、password等的换成abc,但是re、selenium、chrome、chromeoptions等等改不了啊

学习编程中的Ben 发表于 2023-4-8 14:16:04

isdkz 发表于 2023-4-8 13:44
这个大语言模型它不是一定要接触过才懂呀

只要符合人类语言的通性它就能理解出其含义

你是用什么的?分享一下

isdkz 发表于 2023-4-8 14:16:37

学习编程中的Ben 发表于 2023-4-8 14:16
你是用什么的?分享一下

ai.com

发表于 1970-1-1 08:00:00

the-study 发表于 2023-4-8 14:39:51

isdkz 发表于 2023-4-8 14:40:46

the-study 发表于 2023-4-8 14:39
要fan qiang

正常

the-study 发表于 2023-4-8 14:48:24

isdkz 发表于 2023-4-8 14:49:49

the-study 发表于 2023-4-8 14:48
你用什么fan qiang

这种东西就不能随便谈{:10_277:},会蹲jz 的

学习编程中的Ben 发表于 2023-4-8 14:56:18

isdkz 发表于 2023-4-8 14:49
这种东西就不能随便谈,会蹲jz 的

来看看高山做的论坛吧 -> http://w466763.s108-165.myverydz.cn
刚刚那个是我的小号

isdkz 发表于 2023-4-8 15:01:31

学习编程中的Ben 发表于 2023-4-8 14:56
来看看高山做的论坛吧 -> http://w466763.s108-165.myverydz.cn
刚刚那个是我的小号

还是过个一年半载再说吧{:10_277:}

不是我针对,说现实的,没有合理的运营和盈利方式撑不了多久的
页: [1] 2
查看完整版本: selenium爬取论坛用户名