2020-12-24 10:01发布
1.安装pyinstaller
2.安装pywin32
3.安装其他模块
4.在爬虫项目里进行相关操作,参照博友:https://blog.csdn.net/la_vie_est_belle/article/details/79017358
4.1在scrapy.cfg文件同路径下创建s_spider.py
4.2写入相关代码
# -*- coding: utf-8 -*-
from
scrapy.crawler
import
CrawlerProcess
scrapy.utils.project
get_project_settings
# 这里是必须引入的
robotparser
scrapy.spiderloader
scrapy.statscollectors
scrapy.logformatter
scrapy.dupefilters
scrapy.squeues
scrapy.extensions.spiderstate
scrapy.extensions.corestats
scrapy.extensions.telnet
scrapy.extensions.logstats
scrapy.extensions.memusage
scrapy.extensions.memdebug
scrapy.extensions.feedexport
scrapy.extensions.closespider
scrapy.extensions.debug
scrapy.extensions.httpcache
scrapy.extensions.statsmailer
scrapy.extensions.throttle
scrapy.core.scheduler
scrapy.core.engine
scrapy.core.scraper
scrapy.core.spidermw
scrapy.core.downloader
scrapy.downloadermiddlewares.stats
scrapy.downloadermiddlewares.httpcache
scrapy.downloadermiddlewares.cookies
scrapy.downloadermiddlewares.useragent
scrapy.downloadermiddlewares.httpproxy
scrapy.downloadermiddlewares.ajaxcrawl
scrapy.downloadermiddlewares.chunked
scrapy.downloadermiddlewares.decompression
scrapy.downloadermiddlewares.defaultheaders
scrapy.downloadermiddlewares.downloadtimeout
scrapy.downloadermiddlewares.httpauth
scrapy.downloadermiddlewares.httpcompression
scrapy.downloadermiddlewares.redirect
scrapy.downloadermiddlewares.retry
scrapy.downloadermiddlewares.robotstxt
scrapy.spidermiddlewares.depth
scrapy.spidermiddlewares.httperror
scrapy.spidermiddlewares.offsite
scrapy.spidermiddlewares.referer
scrapy.spidermiddlewares.urllength
scrapy.pipelines
scrapy.core.downloader.handlers.http
scrapy.core.downloader.contextfactory
# 自己项目用到的
#import scrapy.pipelines.images # 用到图片管道
openpyxl
# 用到openpyxl库
process
=
CrawlerProcess(get_project_settings())
# 'sk' is the name of one of the spiders of the project.
process.crawl(
'sk'
)
process.start()
# the script will block here until the crawling is finished
4.3在s_spider.py目录下:shift+右键,然后点击‘’在此处打开命令窗口‘’,输入:pyinstaller crawl.py,生成dist,build(可删)和crawl.spec(可删)。
4.4在s_spider.exe目录下创建文件夹scrapy,然后到自己安装的scrapy文件夹中把VERSION和mime.types两个文件复制到刚才创建的scrapy文件夹中。
4.5重新打包运行.exe即可,需要爬虫支持,不能单独运行。
#环境python3.6
#爬取APP无忧借条
#通过用户账号密码爬取用户个人信息(我这账号密码已打码)
爬虫部分代码
#coding:utf8
importhashlib
importtime
importurllib3
importjson
headers={'Accept':'*/*','Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,en-US;q=0.8',
'User-Agent':'Mozilla/5.0(Linux;Android6.0.1;Redmi3SBuild/MMB29M;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/53.0.2785.49MobileMBrowser/6.2TBS/043632Safari/537.36jinjiedao'}
origin_data={}#原始数据
result={}#提取后数据
http=urllib3.PoolManager()#http连接池
urllib3.disable_warnings()#禁用各种urllib3警告
#获取token
deflogin(phone,password):
login_url='https://www.gushistory.com/jjdApi/user/login'
headers['refer']='https://www.gushistory.com/jjdapp/html/register/login.html?telephone='+phone
md5=hashlib.md5()
md52=hashlib.md5()
md5.update(password.encode(encoding='utf-8'))#第一次md5
md52.update(md5.hexdigest().encode(encoding='utf-8'))#第二次md5
#创建登陆参数字典
data={'c_telephone':phone,'c_pwd':md52.hexdigest()}
response=excute(login_url,'GET',data)
origin_data['login']=response
returnresponse['token']
#获取登陆后的信息
defgetAccountInfo(token):
account_url='https://www.gushistory.com/jjdApi/user/getHomepageInfo'
headers['refer']='https://www.gushistory.com/jjdapp/html/index.html'
data={'token':token}
response=excute(account_url,'GET',data)
origin_data['account']=response
user_info=response['userInfo']
result['balance']=user_info['n_left_amt']#余额
result['wait_repay_amt']=user_info['n_to_repay_amt']#待还金额
result['wait_receive']=user_info['n_to_receive_amt']#代收金额
result['lender_cnt']=response['borrowInfo']['n_lender_cnt']#出借金额
result['phone']=user_info['c_telephone']#手机号
if'c_name'inuser_info:#名称
result['name']=user_info['c_name']
else:
result['name']='未实名'
if'c_id_card_no'inuser_info:#身份证号
result['id_card']=user_info['c_id_card_no']
returnresult
defexcute(url,method,data):
ifdata==None:
data={}
data['timestamp']=int(round(time.time()*1000))
r=http.request(url=url,method=method,headers=headers,fields=data)
response=json.loads(r.data.decode('utf-8'))
ifresponse['code']==200:
returnresponse['object']
response['error']='处理失败'
returnresponse
if__name__=="__main__":
phone='1516842****'
pwd='123456'
token=login(phone,pwd)
getAccountInfo(token)
运行完结果为json数据
以上是爬虫部分,接下来先把API接口模板写好:
fromflaskimportFlask,g
fromflask_restfulimportreqparse,Api,Resource
fromflask_httpauthimportHTTPTokenAuth
#Flask相关变量声明
app=Flask(__name__)
api=Api(app)
#RESTfulAPI的参数解析--put/post参数解析
parser_put=reqparse.RequestParser()
parser_put.add_argument("user",type=str,required=True,help="needuserdata")
parser_put.add_argument("pwd",type=str,required=True,help="needpwddata")
#这部分是爬虫功能
defto_do(arg1,args2):
return"thisisinfo"
#操作(post/get)资源列表
classTodoList(Resource):
defpost(self):
"""
添加一个新用户:curlhttp://127.0.0.1:5000/users-XPOST-d"name=Brown&age=20"-H"Authorization:tokenfejiasdfhu"
args=parser_put.parse_args()
#构建新用户
user=args['user']
pwd=args['pwd']
info={"info":to_do(user,pwd)}
#资源添加成功,返回201
returninfo,201
#设置路由,即路由地址为http://127.0.0.1:5000/users
api.add_resource(TodoList,"/users")
app.run(debug=True)
接下来将爬虫部分镶嵌到到模板里面,完整代码如下:
defto_do(phone,password):
token=login(phone,password)
returngetAccountInfo(token)
#设置路由
这是用postman测试工具模拟浏览器请求,得出的结果
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下
最多设置5个标签!
1.安装pyinstaller
2.安装pywin32
3.安装其他模块
4.在爬虫项目里进行相关操作,参照博友:https://blog.csdn.net/la_vie_est_belle/article/details/79017358
4.1在scrapy.cfg文件同路径下创建s_spider.py
4.2写入相关代码
# -*- coding: utf-8 -*-
from
scrapy.crawler
import
CrawlerProcess
from
scrapy.utils.project
import
get_project_settings
# 这里是必须引入的
import
robotparser
import
scrapy.spiderloader
import
scrapy.statscollectors
import
scrapy.logformatter
import
scrapy.dupefilters
import
scrapy.squeues
import
scrapy.extensions.spiderstate
import
scrapy.extensions.corestats
import
scrapy.extensions.telnet
import
scrapy.extensions.logstats
import
scrapy.extensions.memusage
import
scrapy.extensions.memdebug
import
scrapy.extensions.feedexport
import
scrapy.extensions.closespider
import
scrapy.extensions.debug
import
scrapy.extensions.httpcache
import
scrapy.extensions.statsmailer
import
scrapy.extensions.throttle
import
scrapy.core.scheduler
import
scrapy.core.engine
import
scrapy.core.scraper
import
scrapy.core.spidermw
import
scrapy.core.downloader
import
scrapy.downloadermiddlewares.stats
import
scrapy.downloadermiddlewares.httpcache
import
scrapy.downloadermiddlewares.cookies
import
scrapy.downloadermiddlewares.useragent
import
scrapy.downloadermiddlewares.httpproxy
import
scrapy.downloadermiddlewares.ajaxcrawl
import
scrapy.downloadermiddlewares.chunked
import
scrapy.downloadermiddlewares.decompression
import
scrapy.downloadermiddlewares.defaultheaders
import
scrapy.downloadermiddlewares.downloadtimeout
import
scrapy.downloadermiddlewares.httpauth
import
scrapy.downloadermiddlewares.httpcompression
import
scrapy.downloadermiddlewares.redirect
import
scrapy.downloadermiddlewares.retry
import
scrapy.downloadermiddlewares.robotstxt
import
scrapy.spidermiddlewares.depth
import
scrapy.spidermiddlewares.httperror
import
scrapy.spidermiddlewares.offsite
import
scrapy.spidermiddlewares.referer
import
scrapy.spidermiddlewares.urllength
import
scrapy.pipelines
import
scrapy.core.downloader.handlers.http
import
scrapy.core.downloader.contextfactory
# 自己项目用到的
#import scrapy.pipelines.images # 用到图片管道
import
openpyxl
# 用到openpyxl库
process
=
CrawlerProcess(get_project_settings())
# 'sk' is the name of one of the spiders of the project.
process.crawl(
'sk'
)
process.start()
# the script will block here until the crawling is finished
4.3在s_spider.py目录下:shift+右键,然后点击‘’在此处打开命令窗口‘’,输入:pyinstaller crawl.py,生成dist,build(可删)和crawl.spec(可删)。
4.4在s_spider.exe目录下创建文件夹scrapy,然后到自己安装的scrapy文件夹中把VERSION和mime.types两个文件复制到刚才创建的scrapy文件夹中。
4.5重新打包运行.exe即可,需要爬虫支持,不能单独运行。
#环境python3.6
#爬取APP无忧借条
#通过用户账号密码爬取用户个人信息(我这账号密码已打码)
爬虫部分代码
#coding:utf8
importhashlib
importtime
importurllib3
importjson
headers={'Accept':'*/*','Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,en-US;q=0.8',
'User-Agent':'Mozilla/5.0(Linux;Android6.0.1;Redmi3SBuild/MMB29M;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/53.0.2785.49MobileMBrowser/6.2TBS/043632Safari/537.36jinjiedao'}
origin_data={}#原始数据
result={}#提取后数据
http=urllib3.PoolManager()#http连接池
urllib3.disable_warnings()#禁用各种urllib3警告
#获取token
deflogin(phone,password):
login_url='https://www.gushistory.com/jjdApi/user/login'
headers['refer']='https://www.gushistory.com/jjdapp/html/register/login.html?telephone='+phone
md5=hashlib.md5()
md52=hashlib.md5()
md5.update(password.encode(encoding='utf-8'))#第一次md5
md52.update(md5.hexdigest().encode(encoding='utf-8'))#第二次md5
#创建登陆参数字典
data={'c_telephone':phone,'c_pwd':md52.hexdigest()}
response=excute(login_url,'GET',data)
origin_data['login']=response
returnresponse['token']
#获取登陆后的信息
defgetAccountInfo(token):
account_url='https://www.gushistory.com/jjdApi/user/getHomepageInfo'
headers['refer']='https://www.gushistory.com/jjdapp/html/index.html'
data={'token':token}
response=excute(account_url,'GET',data)
origin_data['account']=response
user_info=response['userInfo']
result['balance']=user_info['n_left_amt']#余额
result['wait_repay_amt']=user_info['n_to_repay_amt']#待还金额
result['wait_receive']=user_info['n_to_receive_amt']#代收金额
result['lender_cnt']=response['borrowInfo']['n_lender_cnt']#出借金额
result['phone']=user_info['c_telephone']#手机号
if'c_name'inuser_info:#名称
result['name']=user_info['c_name']
else:
result['name']='未实名'
if'c_id_card_no'inuser_info:#身份证号
result['id_card']=user_info['c_id_card_no']
returnresult
defexcute(url,method,data):
ifdata==None:
data={}
data['timestamp']=int(round(time.time()*1000))
r=http.request(url=url,method=method,headers=headers,fields=data)
response=json.loads(r.data.decode('utf-8'))
ifresponse['code']==200:
returnresponse['object']
else:
response['error']='处理失败'
returnresponse
if__name__=="__main__":
phone='1516842****'
pwd='123456'
token=login(phone,pwd)
getAccountInfo(token)
运行完结果为json数据
以上是爬虫部分,接下来先把API接口模板写好:
fromflaskimportFlask,g
fromflask_restfulimportreqparse,Api,Resource
fromflask_httpauthimportHTTPTokenAuth
#Flask相关变量声明
app=Flask(__name__)
api=Api(app)
#RESTfulAPI的参数解析--put/post参数解析
parser_put=reqparse.RequestParser()
parser_put.add_argument("user",type=str,required=True,help="needuserdata")
parser_put.add_argument("pwd",type=str,required=True,help="needpwddata")
#这部分是爬虫功能
defto_do(arg1,args2):
return"thisisinfo"
#操作(post/get)资源列表
classTodoList(Resource):
defpost(self):
"""
添加一个新用户:curlhttp://127.0.0.1:5000/users-XPOST-d"name=Brown&age=20"-H"Authorization:tokenfejiasdfhu"
"""
args=parser_put.parse_args()
#构建新用户
user=args['user']
pwd=args['pwd']
info={"info":to_do(user,pwd)}
#资源添加成功,返回201
returninfo,201
#设置路由,即路由地址为http://127.0.0.1:5000/users
api.add_resource(TodoList,"/users")
if__name__=="__main__":
app.run(debug=True)
接下来将爬虫部分镶嵌到到模板里面,完整代码如下:
fromflaskimportFlask,g
fromflask_restfulimportreqparse,Api,Resource
fromflask_httpauthimportHTTPTokenAuth
importhashlib
importtime
importurllib3
importjson
#Flask相关变量声明
app=Flask(__name__)
api=Api(app)
#RESTfulAPI的参数解析--put/post参数解析
parser_put=reqparse.RequestParser()
parser_put.add_argument("user",type=str,required=True,help="needuserdata")
parser_put.add_argument("pwd",type=str,required=True,help="needpwddata")
headers={'Accept':'*/*','Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,en-US;q=0.8',
'User-Agent':'Mozilla/5.0(Linux;Android6.0.1;Redmi3SBuild/MMB29M;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/53.0.2785.49MobileMBrowser/6.2TBS/043632Safari/537.36jinjiedao'}
origin_data={}#原始数据
result={}#提取后数据
http=urllib3.PoolManager()#http连接池
urllib3.disable_warnings()#禁用各种urllib3警告
#获取token
deflogin(phone,password):
login_url='https://www.gushistory.com/jjdApi/user/login'
headers['refer']='https://www.gushistory.com/jjdapp/html/register/login.html?telephone='+phone
md5=hashlib.md5()
md52=hashlib.md5()
md5.update(password.encode(encoding='utf-8'))#第一次md5
md52.update(md5.hexdigest().encode(encoding='utf-8'))#第二次md5
#创建登陆参数字典
data={'c_telephone':phone,'c_pwd':md52.hexdigest()}
response=excute(login_url,'GET',data)
origin_data['login']=response
returnresponse['token']
#获取登陆后的信息
defgetAccountInfo(token):
account_url='https://www.gushistory.com/jjdApi/user/getHomepageInfo'
headers['refer']='https://www.gushistory.com/jjdapp/html/index.html'
data={'token':token}
response=excute(account_url,'GET',data)
origin_data['account']=response
user_info=response['userInfo']
result['balance']=user_info['n_left_amt']#余额
result['wait_repay_amt']=user_info['n_to_repay_amt']#待还金额
result['wait_receive']=user_info['n_to_receive_amt']#代收金额
result['lender_cnt']=response['borrowInfo']['n_lender_cnt']#出借金额
result['phone']=user_info['c_telephone']#手机号
if'c_name'inuser_info:#名称
result['name']=user_info['c_name']
else:
result['name']='未实名'
if'c_id_card_no'inuser_info:#身份证号
result['id_card']=user_info['c_id_card_no']
returnresult
defexcute(url,method,data):
ifdata==None:
data={}
data['timestamp']=int(round(time.time()*1000))
r=http.request(url=url,method=method,headers=headers,fields=data)
response=json.loads(r.data.decode('utf-8'))
ifresponse['code']==200:
returnresponse['object']
else:
response['error']='处理失败'
returnresponse
defto_do(phone,password):
token=login(phone,password)
returngetAccountInfo(token)
#操作(post/get)资源列表
classTodoList(Resource):
defpost(self):
"""
添加一个新用户:curlhttp://127.0.0.1:5000/users-XPOST-d"name=Brown&age=20"-H"Authorization:tokenfejiasdfhu"
"""
args=parser_put.parse_args()
#构建新用户
user=args['user']
pwd=args['pwd']
info={"info":to_do(user,pwd)}
#资源添加成功,返回201
returninfo,201
#设置路由
api.add_resource(TodoList,"/users")
if__name__=="__main__":
app.run(debug=True)
这是用postman测试工具模拟浏览器请求,得出的结果
相关问题推荐
换行。比如,print hello\nworld效果就是helloworld\n就是一个换行符。\是转义的意思,'\n'是换行,'\t'是tab,'\\'是,\ 是在编写程序中句子太长百,人为换行后加上\但print出来是一整行。...
十种常见排序算法一般分为以下几种:(1)非线性时间比较类排序:a. 交换类排序(快速排序、冒泡排序)b. 插入类排序(简单插入排序、希尔排序)c. 选择类排序(简单选择排序、堆排序)d. 归并排序(二路归并排序、多路归并排序)(2)线性时间非比较类排序:...
前景很好,中国正在产业升级,工业机器人和人工智能方面都会是强烈的热点,而且正好是在3~5年以后的时间。难度,肯定高,要求你有创新的思维能力,高数中的微积分、数列等等必须得非常好,软件编程(基础的应用最广泛的语言:C/C++)必须得很好,微电子(数字电...
迭代器与生成器的区别:(1)生成器:生成器本质上就是一个函数,它记住了上一次返回时在函数体中的位置。对生成器函数的第二次(或第n次)调用,跳转到函数上一次挂起的位置。而且记录了程序执行的上下文。生成器不仅记住了它的数据状态,生成器还记住了程序...
python中title( )属于python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写
第一种解释:代码中的cnt是count的简称,一种电脑计算机内部的数学函数的名字,在Excel办公软件中计算参数列表中的数字项的个数;在数据库( sq| server或者access )中可以用来统计符合条件的数据条数。函数COUNT在计数时,将把数值型的数字计算进去;但是...
head是方法,所以需要取小括号,即dataset.head()显示的则是前5行。data[:, :-1]和data[:, -1]。另外,如果想通过位置取数据,请使用iloc,即dataset.iloc[:, :-1]和dataset.iloc[:, -1],前者表示的是取所有行,但不包括最后一列的数据,结果是个DataFrame。...
挺简单的,其实课程内容没有我们想象的那么难、像我之前同学,完全零基础,培训了半年,直接出来就工作了,人家还在北京大公司上班,一个月15k,实力老厉害了
Python针对众多的类型,提供了众多的内建函数来处理(内建是相对于导入import来说的,后面学习到包package时,将会介绍),这些内建函数功用在于其往往可对多种类型对象进行类似的操作,即多种类型对象的共有的操作;如果某种操作只对特殊的某一类对象可行,Pyt...
相当于 ... 这里不是注释
还有FIXME
python的两个库:xlrd和xlutils。 xlrd打开excel,但是打开的excel并不能直接写入数据,需要用xlutils主要是复制一份出来,实现后续的写入功能。
单行注释:Python中的单行注释一般是以#开头的,#右边的文字都会被当做解释说明的内容,不会被当做执行的程序。为了保证代码的可读性,一般会在#后面加一两个空格然后在编写解释内容。示例:# 单行注释print(hello world)注释可以放在代码上面也可以放在代...
主要是按行读取,然后就是写出判断逻辑来勘测行是否为注视行,空行,编码行其他的:import linecachefile=open('3_2.txt','r')linecount=len(file.readlines())linecache.getline('3_2.txt',linecount)这样做的过程中发现一个问题,...
或许是里面有没被注释的代码
自学的话要看个人情况,可以先在B站找一下视频看一下