请选择 进入手机版 | 继续访问电脑版
用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 303|回复: 1

基于Python3开发的自动签到拿京豆软件-1.源码及调试过程

[复制链接]

909

主题

912

帖子

3877

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3877
发表于 2017-12-28 19:18:00 | 显示全部楼层 |阅读模式
https://www.toutiao.com/a6504409 ... amp;wxshare_count=1

京东网站上,在京东会员首页,有每日签到会送京豆;在我的京东-我的京豆页,有进店签到领京豆;在我的京豆-流量加油站页,有签到领流量。我们用Python来开发写程序,实现每天自动领京豆和流量。主要用到Python,selenium模块和 BeautifulSoup模块。
一、源码
from bs4 import BeautifulSoup
from selenium import webdriver
import time
browser = webdriver.Firefox()#用火狐浏览器
browser.get('http://vip.jd.com/home.html')#打开登录页面
browser.find_element_by_link_text('账户登录').click()
browser.find_element_by_id('loginname').send_keys('你的用户名')
browser.find_element_by_id('nloginpwd').send_keys('密码')
browser.find_element_by_xpath('//*[@id="loginsubmit"]').click()
time.sleep(1)
try:
browser.find_element_by_class_name('sign-in').click()
print('签到成功')
except:
print('不能重复签到,签到失败')
#print(browser.current_window_handle)调试程序时查看当前的网页句柄
browser.get('http://bean.jd.com/myJingBean/list')
time.sleep(1)
#print(browser.current_window_handle)
#handles = browser.window_handles
#print(handles)
soup = BeautifulSoup(browser.page_source)
ylink =soup.find_all(class_ = 's-btn')
#print(ylink)
for link in ylink:
#print(link.get('href'))
browser.get(link.get('href'))#获得网址并直接打开
time.sleep(1)
browser.find_element_by_link_text('签到').click()
time.sleep(1)
time.sleep(1)
browser.get('http://datawallet.jd.com/profile.html')
time.sleep(1)
browser.find_element_by_class_name('btn-sign').click()
time.sleep(1)
browser.quit()
二、开发环境的搭建:
  • 安装Python3(自行搜索安装,这里不作介绍);
  • 安装selenium模块和 BeautifulSoup模块

selenium模块让Python直接控制浏览器,实际点击链接,填写登录信息,几乎就像是有一个人类用户在与页面交互。与Requests和BeautifulSoup相比,selenium允许你用高级的多的方式与网页交互。
安装方法:pip install selenium;
在Python中调用:from selenium import webdriver
BeautifulSoup模块的名称是bs4(表示 BeautifulSoup第4版),用于从HTML页面(网页源码)中提取信息(比正则表达式要好很多)。
安装方法:在命令行中运行pip install beautifulsoup4;
在Python中调用:from bs4 import BeautifulSoup
3.安装火狐浏览器(自行下载最新版安装),下载并配置火狐浏览器驱动 geckodriver
将下载好的geckodriver解压后,将geckodriver.exe放在安装过火狐浏览器的目录下,本机在Crogram Files (x86)Mozilla Firefox;
三、需求分析
第一步,打开浏览器,进入京东登录页面,自动登录;
第二步,签到页点击签到;
第三步,进店签到领京豆栏获得店铺的网址,进入相应店铺点击签到;
第四步,进入签到领流量页面,点击签到领流量。
第一步:
from bs4 import BeautifulSoup
from selenium import webdriver
import time
browser = webdriver.Firefox()#用火狐浏览器
browser.get('http://vip.jd.com/home.html')#打开登录页面
browser.find_element_by_link_text('账户登录').click()
browser.find_element_by_id('loginname').send_keys('你的用户名')
browser.find_element_by_id('nloginpwd').send_keys('密码')
browser.find_element_by_xpath('//*[@id="loginsubmit"]').click()
第二步:
browser.find_element_by_class_name('sign-in').click()
  • 火狐浏览器有一个功能很方便,定位页面元素,鼠标放在要定位的元素上,右键单击,选择(查看元素),即可看到相应元素的网页源码,在相应的 网页代码上右键单击-复制-Xpath项可以直接获得元素的路径。

2.selenium模块在页面中寻找元素的方法browser.find_element_by_...;browser.find_elements_by_...
(此处自行搜索学习)。需要注意的一点是browser.find_elements_by_...返回的是一个列表,不能使用.click()进行点击。
第三步:
进入我的京东-我的京豆页面,browser.get('http://bean.jd.com/myJingBean/list');
使用BeautifulSoup模块读取当前页面的网页源码,soup = BeautifulSoup(browser.page_source);
通过火狐浏览器的查看元素功能,仔细看寻找一下我们要点击进入的各个店铺的链接代码,我们发现,总共有9个店铺,在网页中的代码是9个<li>....</li>,我们的思路是从这9个<li>....</li>源码中获得店铺的链接地址,而后进入店铺页面,在店铺页面中,通过 寻找有“签到”两个字的元素进行点击(browser.find_element_by_link_text('签到').click())。
签到后的状态
ylink =soup.find_all(class_ = 's-btn')
#print(ylink)
for link in ylink:
#print(link.get('href'))
browser.get(link.get('href'))#获得网址并直接打开
time.sleep(1)
browser.find_element_by_link_text('签到').click()
time.sleep(1)
第四步:
进入我的京东-流量加油站页面,browser.get('http://datawallet.jd.com/profile.html');
通过查看网页源代码,我们通过class name定位元素,browser.find_element_by_class_name('btn-sign').click()。
最后退出浏览器。


  1. # -*- encoding:utf8 -*-
  2. from bs4 import BeautifulSoup

  3. from selenium import webdriver

  4. import time

  5. import sys

  6. browser = webdriver.Firefox()#用火狐浏览器
  7. # 打开登录页面
  8. browser.get('http://vip.jd.com/home.html')#打开登录页面

  9. browser.find_element_by_link_text('账户登录').click()

  10. browser.find_element_by_id('loginname').send_keys('lizhihua0625')

  11. browser.find_element_by_id('nloginpwd').send_keys('l19860625')

  12. browser.find_element_by_xpath('//*[@id="loginsubmit"]').click()

  13. time.sleep(1)

  14. try:

  15.         browser.find_element_by_class_name('sign-in').click()

  16.         print('签到成功1')

  17. except:

  18.         print('不能重复签到,签到失败1')

  19.         #print(browser.current_window_handle)调试程序时查看当前的网页句柄
  20.         try:
  21.                 # 进入我的京东-我的京豆页面
  22.                 browser.get('http://bean.jd.com/myJingBean/list')

  23.                 time.sleep(1)

  24.                 # print(browser.current_window_handle)

  25.                 #handles = browser.window_handles

  26.                 # print(handles)

  27.                 # soup = BeautifulSoup(browser.page_source)
  28.                 soup = BeautifulSoup(browser.page_source, "lxml")
  29.                 # print(soup)
  30.                 ylink =soup.find_all(class_ = 'c-btn')

  31.                 # print(ylink)

  32.                 for link in ylink:
  33.                         if "com" in link.get('href'):
  34.                                 print(link.get('href'))

  35.                                 browser.get(link.get('href'))#获得网址并直接打开

  36.                                 time.sleep(1)
  37.                                 # browser.find_element_by_link_text('领取并关注').click()
  38.                                 browser.find_element_by_link_text('签到').click()
  39.                                 print('签到成功2')
  40.                                 time.sleep(1)
  41.         except:

  42.                 time.sleep(1)
  43.                 print('不能重复签到,签到失败2')
  44.                 print ("Connect fail! Program will myJingBean terminate 5 seconds later!")
  45.                 # browser.quit()
  46.                 # sys.exit()



  47. # time.sleep(1)


  48. try:
  49.         # 进入我的京东-流量加油站页面
  50.         browser.get('http://datawallet.jd.com/profile.html')

  51.         time.sleep(1)

  52.         browser.find_element_by_class_name('btn-sign').click()

  53.         time.sleep(1)
  54.         print('流量领取成功或已经领取')
  55.         browser.quit()
  56.         sys.exit()
  57. except:
  58.         time.sleep(1)
  59.         print('不能重复领取流量')
  60.         print ("Connect fail! Program will profile terminate 5 seconds later!")
  61.         browser.quit()
  62.         sys.exit()


复制代码


回复

使用道具 举报

909

主题

912

帖子

3877

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3877
 楼主| 发表于 2017-12-28 19:18:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则

返回顶部