python 拼多多_拼多多现重大BUG被“薅羊毛”,教你如何用Python简单褥羊毛

import time

from urllib.parse import parse_qs

import requests

from bs4 import BeautifulSoup

from selenium import webdriver

from selenium.common.exceptions import *

from selenium.webdriver.support.wait import WebDriverWait

# 额外抽取的授权模块

from utils import auth

class QMM(object):

"""借助券妈妈平台褥京东京豆"""

def __init__(self, sleep=3, months=None, days=None):

self.timeout, self.months, self.days = sleep, None, None

# 爬取规则

if months:

month_interval = months.split('-')

start_month, end_month = int(month_interval[0]), int(month_interval[-1])

self.months = list(map(lambda m: '{}月'.format(m), range(start_month, end_month + 1)))

if days:

day_interval = days.split('-')

start_day, end_day = int(day_interval[0]), int(day_interval[-1])

self.days = list(map(lambda d: '{}日'.format(d), range(start_day, end_day + 1)))

# 手机店铺(用作提醒输出,可复制链接到手机端领取)

self.m_shop = []

# 统计京豆总数

self.jing_dou = 0

def _crawl_url(self):

""" 抓取京豆更新页, 获得店铺京豆领取地址"""

# 日期更新页

qmm_collect = 'http://www.quanmama.com/zhidemai/2459063.html'

bs = BeautifulSoup(requests.get(qmm_collect).text, 'html.parser')

for link in bs.tbody.find_all('a'):

text = link.text

if self.months:

if not list(filter(lambda m: m in text, self.months)): continue

if self.days:

if not list(filter(lambda d: d in text, self.days)): continue

qmm_detail = link.get('href')

# 店铺领取页

resp = requests.get(qmm_detail)

bs = BeautifulSoup(resp.text, 'html.parser')

for body in bs.find_all('tbody'):

for mall in body.find_all('a'):

url = self._parse_url(mall.get('href'))

if 'shop.m.jd.com' in url:

self.m_shop.append(url)

else:

yield url

@staticmethod

def _parse_url(url):

"""提取URL中的url参数"""

mall_url = parse_qs(url).get('url')

return mall_url.pop() if mall_url else url

def start(self):

""" 登录京东,领取店铺羊毛"""

malls = set(self._crawl_url())

print('共有 %d 个可褥羊毛PC端店铺页面' % len(malls))

m_malls = self.m_shop

print('共有 %d 个可褥羊毛手机端店铺页面' % len(m_malls))

for m_mall in m_malls:

print(m_mall)

if malls:

# 登陆京东(Chrome、PhantomJS or FireFox)

driver = webdriver.Chrome()  # driver = webdriver.PhantomJS()

jd_login = 'https://passport.jd.com/new/login.aspx'

driver.get(jd_login)

# 窗口最大化

driver.maximize_window()

# QQ授权登录

driver.find_element_by_xpath('//*[@id="kbCoagent"]/ul/li[1]/a').click()

auth.qq(driver)

time.sleep(self.timeout)

# 开始褥羊毛

for i, detail in enumerate(malls):

driver.get(detail)

print('%d.店铺: %s' % (i + 1, detail), end='')

try:

# 查找"领取"按钮

btn = WebDriverWait(driver, self.timeout).until(

lambda d: d.find_element_by_css_selector("[class='J_drawGift d-btn']"))

except TimeoutException:

# 失败大多数情况下是无羊毛可褥(券妈妈平台只是简单汇总但不一定就有羊毛)

print(' 领取失败, TimeoutException ')

else:

try:

# 输出羊毛战绩

items = WebDriverWait(driver, self.timeout).until(

lambda d: d.find_elements_by_css_selector("[class='d-item']"))

for item in items:

item_type = item.find_element_by_css_selector("[class='d-type']").text

item_num = item.find_element_by_css_selector("[class='d-num']").text

if item_type == '京豆': self.jing_dou += item_num

print(' {}{} '.format(item_type, item_num), end='')

except:

# 此处异常不太重要, 忽略

pass

finally:

btn.click()

print(' 领取成功')

# 以下附加功能可选

self._print_jing_dou()

self._un_subscribe(driver)

self._finance_sign(driver)

def _print_jing_dou(self):

print('O(∩_∩)O哈哈~, 共褥到了{}个京豆,相当于RMB{}元', self.jing_dou, self.jing_dou / 100)

def _un_subscribe(self, driver):

"""批量取消店铺关注"""

# 进入关注店铺

subscribe_shop = 'https://t.jd.com/vender/followVenderList.action'

driver.get(subscribe_shop)

try:

# 批量操作

batch_btn = WebDriverWait(driver, self.timeout).until(

lambda d: d.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[2]/div[2]/div/a'))

batch_btn.click()

# 全选店铺

all_btn = WebDriverWait(driver, self.timeout).until(

lambda d: d.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[2]/div[2]/div/div/span[1]'))

all_btn.click()

# 取消关注

cancel_btn = WebDriverWait(driver, self.timeout).until(

lambda d: d.find_element_by_xpath('//*[@id="main"]/div/div[2]/div[1]/div[2]/div[2]/div/div/span[2]'))

cancel_btn.click()

# 弹框确认

confirm_btn = WebDriverWait(driver, self.timeout).until(

lambda d: d.find_element_by_xpath("/html/body/div[7]/div[3]/a[1]"))

except TimeoutException:

print(' 批量取关店铺失败, TimeoutException ')

else:

confirm_btn.click()

print(' 已批量取消关注店铺')

def _finance_sign(self, driver):

"""京东金融签到领钢镚"""

# 进入京东金融

jr_login = 'https://jr.jd.com/'

driver.get(jr_login)

try:

# 点击签到按钮

sign_btn = WebDriverWait(driver, self.timeout).until(

lambda d: d.find_element_by_xpath('//*[@id="primeWrap"]/div[1]/div[3]/div[1]/a'))

except TimeoutException:

print(' 京东金融签到失败, TimeoutException ')

else:

sign_btn.click()

print(' 京东金融签到成功')

if __name__ == '__main__':

qmm = QMM(sleep=3, months='7-8', days='16-31')

qmm.start()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上海交通大学python期末考试样题加解析_上海交通大学python期末考试样题加解析...

一、选择题: 将唯一正确的选项写在题前括号中.每题2分.【】(1) 本课程的目标定位是什么?[A] 学习Python语言[B] 学习计算机的工作原理[C] 学习各种算法[D] 学习用计算机解决问题【】(2) 下列哪个标识符是合法的?[A] var-name [B] !#$% [C] _100 [D] elif【】(3) 执行下列语句…

mysql 安装测试ok_tpcc-mysql安装测试与使用的实例教程

1:下载tpcc-mysql的压缩包,从下面的网站进行下载也可直接从叶总博客直接下载:我这边使用的就是后者。2:安装tpcc-mysql[rootmxqmongodb2 tpccmysql]# gunzip tpcc-mysql-src.tgz[rootmxqmongodb2 tpccmysql]# tar xf tpcc-mysql-s…

python多线程写同一文件_Python多线程写文件实例

# -*- coding: utf-8 -*-import threading多线程生成日志工具__author ["yangfei" ]#该方法主要用于写入300行WARN日志def writeWarnLog(file):count0;while count<300:try:file.write(2012-11-28 22:51:01|zookeeper|WARN|m1|172.17.1.15\n)count1except Except…

Tomcat6.0.37,tomcat6.0.37,下访问Web项目,jsp项目不需要输入项目名称和端口号的配置方法...

1.不需要数据项目名称就可以访问项目的配置方法如下&#xff1a; 首先到你的Tomcat下的conf文件夹下找到server.xml文件&#xff0c;打开后修改为&#xff1a; <Host name"localhost" appBase"webapps"unpackWARs"true" autoDeploy"tru…

java合并list_java合并list方法代码实例

这篇文章主要介绍了java合并list方法代码实例,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下List包括List接口以及List接口的所有实现类。因为List接口实现了Collection接口&#xff0c;所以List接口拥有Collec…

java math 函数_Java中Math类常用函数总结

Java中比较常用的几个数学公式的总结&#xff1a;//取整&#xff0c;返回小于目标函数的最大整数,如下将会返回-2Math.floor(-1.8)&#xff1b;//取整&#xff0c;返回发育目标数的最小整数Math.ceil()//四舍五入取整Math.round()//计算平方根Math.sqrt()//计算立方根Math.cbrt…

java asc码_Java中ASC码与字符互相转化

package com.ljq.test;/*** Java中ASC码与字符互相转化** author jiqinlin**/public class ASCTest {private static int ascNum;private static char strChar;public static void main(String[] args) {System.out.println(getAsc("a"));System.out.println(backcha…

java上传png_java上传png图片出现红色背景

java图片上传出现红色背景java图片服务器上传图片都很正常&#xff0c;唯独上传png图片时&#xff0c;png图片变成红色背景原因是读取上传数据时用的是ImageIO.read(inputstream)方法public static BufferedImage getImages(byte[] data) throws IOException {ByteArrayInputSt…

java 引用队列_Java中管理资源的引用队列相关原理解析

当对象改变其可达性状态时&#xff0c;对该对象的引用就可能会被置于引用队列(reference queue)中。这些队列被垃圾回收器用来与我们的代码沟通有关对象可达性变化的情况。这些队列是探测可达性变化的最佳方式&#xff0c;尽管我们也可以通过检查get方法的返回值是不是null来探…

Tomcat 替换项目图标

1.首先制作一个32*32像素的图标&#xff0c;命名为favicon.ico这里名称必须是和Tomcat的webapps下的ROOT下的一样。 2.把制作好的图标放到你要部署的Web项目的images目录下&#xff0c;如果你的Web项目有过滤器等&#xff0c;要给后缀名为.ico的图标放行。 3.最后你就可以在你需…

hp 导出日志 远程管理卡_惠普服务器远程管理卡安装详解

可以远程管理服务器。带惠普基于Web的网络资源管理和性能监视工具HP Toptools惠普远程管理卡的主要功能是可以实现对服务器的远程监控&#xff0c;其中包括察看日志、远程诊断、远程开/关机、重启等等。基于惠普远程管理卡的重要功能&#xff0c;本文将着重介绍惠普远程管理卡的…

java 错误登陆次数_纯java代码实现登陆次数验证,登陆错误5次之后锁定30分钟

本方法因为是根据思路纯手写&#xff0c;代码可以再简化&#xff0c;功能尝试没问题&#xff0c;最主要就是在登陆验证中的逻辑&#xff0c;checkLogin()方法是登录前的验证&#xff0c;而真正的登陆方式采用的是Shiro&#xff0c;若不是采用Shiro登陆&#xff0c;将该逻辑采用…

java 监听器 分类_java过滤器和监听器详解 分类: 学习专区

过滤器1、Filter工作原理(执行流程)当客户端发出Web资源的请求时&#xff0c;Web服务器根据应用程序配置文件设置的过滤规则进行检查&#xff0c;若客户请求满足过滤规则&#xff0c;则对客户请求&#xff0f;响应进行拦截&#xff0c;对请求头和请求数据进行检查或改动&#x…

linux java启动脚本文件_不错的linux下通用的java程序启动脚本

#!/bin/sh#该脚本为Linux下启动java程序的通用脚本。即可以作为开机自启动service脚本被调用&#xff0c;#也可以作为启动java程序的独立脚本来使用。##Author: tudaxia.com, Date: 2011/6/7##警告!!!&#xff1a;该脚本stop部分使用系统kill命令来强制终止指定的java程序进程。…

linux心跳包检测代码_OpenSSL心跳包越界读敏感信息泄漏漏洞

发布日期&#xff1a;2014-04-10CVE ID&#xff1a;CVE-2014-0160受影响的软件及系统&#xff1a;OpenSSL 1.0.1&#xff0d;OpenSSL 1.0.1fOpenSSL 1.0.2-betaOpenSSL 1.0.2-beta1未受影响的软件及系统&#xff1a;OpenSSL 0.9.8OpenSSL 1.0.0OpenSSL 1.0.1gOpenSSL 1.0.2-bet…

mysql数据库主要负责存储_mysql数据库自带数据库介绍

show databases&#xff1b;查看mysql自带数据库有information_schema&#xff0c;mysql&#xff0c; performance_schema&#xff0c; testinformation_schema数据库有40张表&#xff0c;如下。在MySQL中&#xff0c;把 information_schema 看作是一个数据库&#xff0c;确切说…

python 编辑数学公式_Jupyter快速编辑高大上数学公式 泰勒展开式

欢迎点击「算法与编程之美」↑关注我们&#xff01;本文首发于微信公众号&#xff1a;"算法与编程之美"&#xff0c;欢迎关注&#xff0c;及时了解更多此系列博客。人工智能的基础是机器学习&#xff0c;而通过之前的几篇博客了解到&#xff0c;机器学习的基础是数学…

用java写一个日历_使用JAVA写一个简单的日历

JAVA写一个简单的日历import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import java.util.GregorianCalendar;import java.util.Scanner;/*** 制作一个简单的日历** author 这…

MySQL定时任务event,储存过程(定时删除指定时间前90天指定表的数据)

<span style"font-family: Microsoft YaHei; font-size: 14px;">MySQL定时任务event</span> 由于一些业务需求&#xff0c;我们可能需要定时清除数据库一些废弃的数据&#xff0c;可以使用mysql的存储过程和事件来完成。 下面例子定时清除日志表tbl_base…

python慢为什么用的人还很多_为什么是所有人比python标准慢得多吗?

通过使用生成器理解而不是列表理解&#xff0c;可以使这两个函数更快、更具可比性。在s """import numpy as np;x, y np.random.rand(1000),np.random.rand(1000);(all((x[i], y[i])) for i in range(1000)) """timeit.timeit(s,number1000)0.…