鱼C论坛

 找回密码
 立即注册
查看: 2532|回复: 5

[技术交流] 对于之前发的爬虫案例 自动登录鱼c网站的分析

[复制链接]
发表于 2020-9-27 00:03:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
案例一:自动登录鱼c网站并签到

Ps: 太累了,感觉写得很罗嗦,主要是想尽可能的写全一点,毕竟担心有那种刚学爬虫的小伙伴不懂。但是即使这样,我相信没有学过selenium、xpath的小伙伴可能还是会有点迷茫,但是由于明天还有早八的课(我不是学计算机的,是机械工程),所以就暂时这样吧。谢谢大家,有问题可以随时留言,只要我有时间就会登上fishC看看。


ps:我是第一次写这种分享,写得不清楚或是逻辑很乱,请各位见谅,不要喷我,我相信鱼c的粉丝们都是有爱的人。

一、总体思路分析:
由于我最近刚学习了selenium,然后刚好一直很羡慕别人写的自动签到的功能,所以决定自己也写一个。
首先我们需要确定自己的环境是否正确,即是否安装了selenium库和chrome浏览器以及webdriver这个小插件(如果没有的话,可以自行百度)

二、登录代码的分析:
下面打开chrome,然后输入鱼c的官网,如下图

                               
登录/注册后可看大图

接下来,我们需要使用selenium,来获取右上角登录的tag(标签,学过前端的朋友们肯定熟悉),然后通过selenium输入我们的用户名和密码登录。具体实现的代码如下(不要害怕,下面有具体的分析):
def login(driver):
    url = 'https://fishc.com.cn/forum.php'
    driver.get(url)
    #测试是否能够返回正确html
    # print(driver.page_source)

    # #获取输入的tag和登录的按钮
    username_tag = driver.find_element_by_id('ls_username')
    password_tag = driver.find_element_by_id('ls_password')
    button_tag = driver.find_element_by_xpath('//button[@type="submit"]')

    #输入用户名和密码
    username = input('请输入用户名:')
    password = input('请输入密码:')

    #向输入框输入
    username_tag.send_keys(username)
    password_tag.send_keys(password)
    #确认登录
    button_tag.click()
    time.sleep(2)
    sign_in(driver)
    #测试用的,保存截图,证明登陆成功
    # time.sleep(5)
    # driver.save_screenshot('fishc.jpg')
这里为大家加上关于如何获取tag标签的思路
其实selenium已经为我们封装了足够好用的寻找tag的方法,
    # #获取输入的tag和登录的按钮
    username_tag = driver.find_element_by_id('ls_username')
    password_tag = driver.find_element_by_id('ls_password')
    button_tag = driver.find_element_by_xpath('//button[@type="submit"]')
详细分析A --- 获取标签:
1.关于username_tag标签:

                               
登录/注册后可看大图
如图:先点击输入框,然后右键检查,即可定位该tag,那么如何获取呢,有很多方法,由于时间原因我就不多说,只说说我采取的方法(本菜最近一直在上课,没什么时间),这里我采取的是方法---find_element_by_id(输入的id),可能有的朋友知道,在html代码里面id是唯一的,所以我们使用by_id可以精准的获取某个标签。

2.关于password_tag标签:
获取方式同上

3.这里特别说一下按钮标签(如图):

                               
登录/注册后可看大图
我们需要获取这个标签,然后再之后使用selenium点击它,即可实现登录。
这里我采取的是xpath方式,如果有朋友不知道这个库,那么可以去了解一下,这个库也是一个获取的标签的利器(同bs4re一样牛逼),不了解也没关系,我会大致让你了解一下:
button_tag = driver.find_element_by_xpath('//button[@type="submit"]')
如上面的代码:
// : 代表了从整个html代码(即网页源码)中去寻找
[] : 代表着你要给这个xpath语法增加点附加条件,比如说:这个标签的属性等等
@ : 代表你要写的附加条件为属性
然后我们看看这个按钮标签的html代码(如下图):

                               
登录/注册后可看大图
可以看出来:
他标签的名字叫做:button
他有一些属性:type="submit" class="pn vm" tabindex="904" style="width: 75px;"
这些就足够了,我们首先保证xpath从整个代码中去寻找buttoon,即’//button’,鱼c网站肯定不止一个按钮,所以我们需要加点附加条件,即’//button[@type=”submit”]’。
4. 那么如何为获取的username(用户名)password(密码)输入值呢,这里我们借助了方法send_keys(你需要输入的内容)就可以实现,具体代码如下:
    #输入用户名和密码
    username = input('请输入用户名:')
    password = input('请输入密码:')
5. 如何实现鼠标点击功能:
对于button(按钮)的标签,有一个click()的方法,即可实现点击

三、签到分析:
当我们成功登录后(如果不确定,可以把截图的代码注释取消,会自动截图,已证明登录成功),第一个事情就是获取签到的按钮(如下图),然后转到登录的界面:

                               
登录/注册后可看大图
总体代码如下(具体分析在下面):
def sign_in(driver):
    #转到签到页面
    sign_url = driver.find_element_by_xpath('//li[@id="mn_Nac60"]/a').get_attribute('href') #获取’签到‘按钮的href属性
    driver.get(sign_url)
    time.sleep(2)
    # print(sign_url)

    #开始签到
    sign_button_tag = driver.find_element_by_id('JD_sign')
    sign_button_tag.click()
    print('签到成功')
    time.sleep(2)
详细分析B --- 如何成功的转到签到页面:
    #转到签到页面
    sign_url = driver.find_element_by_xpath('//li[@id="mn_Nac60"]/a').get_attribute('href') #获取’签到‘按钮的href属性
    driver.get(sign_url)
1.首先我们需要找到这个标签:

                               
登录/注册后可看大图
我们可以知道,这个‘签到’的按钮,名为a标签,在li标签之下,所以有以下代码:
driver.find_element_by_xpath('//li[@id="mn_Nac60"]/a')
我们可以从图中看出,这个标签有一个属性为href,这个属性含有签到的网址,我们需要获取这个网址,使用方法(属于获取的标签的方法)get_attribute(属性名字) 获取,如下:
接下来就是使用selenium了,driver.get(url)即可转到这个url所在的网页。

2. 接下来就是获取签到的标签,然后就点击一下,即可完成签到:

                               
登录/注册后可看大图
    万幸的是(主要是写得太累了,哈哈),鱼c网站这个签到的标签,有id,所以非常容易获取,就不分析了,大家如果不太懂selenium,看了前面的分析也应该会懂一些。

0.png
1.png
2.png
3.png
4.png
5.png
6.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-27 00:04:48 | 显示全部楼层
整个程序的代码如下:
# -*- coding:utf-8 -*-
# Author: 自学小白菜

'''
说明:
需要的环境:
Chrome浏览器(谷歌浏览器)和chromedriver
第三方模块:selenium
'''

from selenium import webdriver
import time

#安装chromedriver的路劲
path = r'D:\CHROM\chrome\chromedriver.exe'

def sign_in(driver):
    #转到签到页面
    sign_url = driver.find_element_by_xpath('//li[@id="mn_Nac60"]/a').get_attribute('href') #获取’签到‘按钮的href属性
    driver.get(sign_url)
    time.sleep(2)
    # print(sign_url)

    #开始签到
    sign_button_tag = driver.find_element_by_id('JD_sign')
    sign_button_tag.click()
    print('签到成功')
    time.sleep(2)


def login(driver):
    url = 'https://fishc.com.cn/forum.php'
    driver.get(url)
    #测试是否能够返回正确html
    # print(driver.page_source)

    # #获取输入的tag和登录的按钮
    username_tag = driver.find_element_by_id('ls_username')
    password_tag = driver.find_element_by_id('ls_password')
    button_tag = driver.find_element_by_xpath('//button[@type="submit"]')

    #输入用户名和密码
    username = input('请输入用户名:')
    password = input('请输入密码:')

    #向输入框输入
    username_tag.send_keys(username)
    password_tag.send_keys(password)
    #确认登录
    button_tag.click()
    time.sleep(2)
    sign_in(driver)
    #测试用的,保存截图,证明登陆成功
    # time.sleep(5)
    # driver.save_screenshot('fishc.jpg')


def main():
    driver = webdriver.Chrome(executable_path=path)
    login(driver)


if __name__ == '__main__':
    main()


重要说明:这个程序没有考虑到安全问题,因为我本人没有设置安全问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-27 00:06:30 | 显示全部楼层
程序是没有问题,刚刚又跑了一次,成功了的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

头像被屏蔽
发表于 2020-9-27 07:01:14 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-22 20:38:14 | 显示全部楼层
自学小白菜 发表于 2020-9-27 00:06
程序是没有问题,刚刚又跑了一次,成功了的。

同感{:5_104:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-9 21:14:20 | 显示全部楼层
收藏学习学习,回复一下伸手党也留个爪子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 06:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表