2016-04-27 21:22:44 cromma 阅读数 3127
  • 21天搞定分布式Python网络爬虫

    【本课程如何让你系统掌握python爬虫?】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: * 网络请求:模拟浏览器的行为从网上抓取数据。 * 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 * 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 重点 :通过爬虫进阶的知识点我们能应对大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度! 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 1、面向企业实际需求,为零基础从入门到进阶中级python爬虫工程打造。 2、从最基本的网络抓包开始讲起,到网络请求,再到数据解析和数据存储,再到反反爬虫和分布式爬虫,技术要点十分全面。 3、边学边实做实战项目,从易到难,打好基础,层层深入。不同的实战项目锻炼不同的技能点,让你牢牢掌握爬虫工程师的核心技能。 4、课程以视频+作业+技术辅导的方式学习,确保每个学生对每个知识点都能学懂学透!

    7310 人正在学习 去看看 王涛

Python提取数据

python提取数据
目前实现的代码:

import re

def read_write_file(in_file_path, out_file_path, reg_expression, line_per_loop):
    in_file  = open(in_file_path)
    out_file = open(out_file_path, "a")

    #pattern = re.compile(r'warn.mse.360.cn')
    pattern = re.compile(reg_expression)

    while 1:
        lines = in_file.readlines(line_per_loop)
        if not lines:
            break
        for line in lines:
            #process the line
            match = pattern.search(line)
            if match:
                print line
                out_file.write(line)

    in_file.close()
    out_file.close()




if __name__ == "__main__":
    read_write_file("log.txt", "out.txt", r'INCLUDE', 100000)

访问目录的部分

import os, sys

# depth: the current dir:depth = 0
def dir_walk(dir, out_file, depth):
    out_file.write(dir + '\n')
    current_depth = 0
    file_num = 0

    list = os.listdir(dir)
    for line in list:
        file_path = os.path.join(dir, line)
        if os.path.isdir(file_path):    # is a directory
            #file.write(line + '\\' + '\n')
            dir_walk(file_path, out_file, depth - 1)
        elif os.path:    # is a file
            #process the line
            read_write_file(file_path, out_file, r'warn\.mse\.360\.cn', 100000)


if __name__ == "__main__":
    #dir_path = os.getcwd()
    file = open('path.txt', 'w')
    dir_walk('E:\\git', file, 2)

数据部分在优盘里

最后完善的代码:

import re
import os, sys

# in_file_path: the file will be read that maybe in different path
# out_file: the content that was been extracted from the source file
# reg_expression: the regulation rules that want to extract
# liner_per_loop: the lines that will be loaded per time
def read_write_file(in_file_path, out_file, reg_expression, line_per_loop):
    in_file  = open(in_file_path)

    #pattern = re.compile(r'warn.mse.360.cn')
    pattern = re.compile(reg_expression)

    while 1:
        lines = in_file.readlines(line_per_loop)
        if not lines:
            break
        for line in lines:
            #process the line
            match = pattern.search(line)
            if match:
                print line
                out_file.write(line)

    in_file.close()


# dir: the directory that will be search
# out_file: the file that has been opened
# depth: the current dir:depth = 0
def dir_walk(dir, out_file, current_depth, max_depth):
    print current_depth
    if current_depth > max_depth:
        return

    list = os.listdir(dir)
    for line in list:
        print line
        file_path = os.path.join(dir, line)
        if os.path.isdir(file_path):    # is a directory
            dir_walk(file_path, out_file, current_depth + 1, max_depth)
        elif os.path:    # is a file
            if current_depth != 0:
                #process the line
                read_write_file(file_path, out_file, r'INCLUDE', 100000)

if __name__ == "__main__":
    current_dir = os.getcwd()
    out_file = open("extract_log.txt", "a")

    dir_walk(current_dir, out_file, 0, 3)

    out_file.close()

在第0层中,代码只会对文件夹进行扫描,其他层次扫描所有的文件和目录。

2018-11-13 14:52:12 sgqhappy 阅读数 687
  • 21天搞定分布式Python网络爬虫

    【本课程如何让你系统掌握python爬虫?】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: * 网络请求:模拟浏览器的行为从网上抓取数据。 * 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 * 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 重点 :通过爬虫进阶的知识点我们能应对大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度! 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 1、面向企业实际需求,为零基础从入门到进阶中级python爬虫工程打造。 2、从最基本的网络抓包开始讲起,到网络请求,再到数据解析和数据存储,再到反反爬虫和分布式爬虫,技术要点十分全面。 3、边学边实做实战项目,从易到难,打好基础,层层深入。不同的实战项目锻炼不同的技能点,让你牢牢掌握爬虫工程师的核心技能。 4、课程以视频+作业+技术辅导的方式学习,确保每个学生对每个知识点都能学懂学透!

    7310 人正在学习 去看看 王涛

数据提取python脚本

版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/sgqhappy/article/details/83988985

我们经常用到数据提取的Hive Sql的编写,每次数据提取都得进行hive的编写,为了将这种重复性强的运行命令简单化自动化人性化,我特地编写了一个python脚本,可以实现数据清洗,数据处理,计数下发,读写文件,保存日志等功能。

1. 导包

#!/usr/bin/python
#coding:utf-8

#Made by sgqhappy
#Date: 20181113
#function: data extract

from subprocess import Popen,PIPE
import os
import sys
import io
import re
import commands
import logging
from logging import handlers
from re import match

2. 定义一个类,用来打印脚本运行的log日志

日志既可以打印在控制台上,也可以输出到log文件。

class Logger(object):
	def __init__(self,log_file_name,log_level,logger_name):
		self.__logger = logging.getLogger(logger_name);
		self.__logger.setLevel(log_level);
		file_handler = logging.FileHandler(log_file_name);
		console_handler = logging.StreamHandler();
		
		#set log format and show log at console and log_file.
		LOG_FORMAT = "%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s : %(message)s";
		formatter = logging.Formatter(LOG_FORMAT);
		
		file_handler.setFormatter(formatter);
		console_handler.setFormatter(formatter);
		
		self.__logger.addHandler(file_handler);
		self.__logger.addHandler(console_handler);
		
	def get_log(self):
		return self.__logger;

3. 定义文件名及文件路径

	#This is file name.
	file_name = "%s_%s_%s" % (sys.argv[2],sys.argv[4],sys.argv[11]);
	info_log_path = '/python_test/%s.info.log' % (file_name);
	
	#this is record name and path.
	record_name = "data_extract_record.txt";
	record_path = "/python_test/";
	
	logger = Logger(log_file_name="%s" % (info_log_path),log_level=logging.DEBUG,logger_name="myLogger").get_log();
	
	#this is log path.
	path = '/python_test/%s.desc.log' % (file_name);
	logger.info("\n");
	logger.info("log path: %s" % (path));
	logger.info("\n");

4. 提取字段信息保存

	#function:write all fields to log file.
	hive_cmd_desc = 'beeline -u ip -n username -e "desc %s.%s" >> %s' % (sys.argv[1],sys.argv[2],path);
	logger.info(hive_cmd_desc);
	logger.info("\n");
	status,output = commands.getstatusoutput(hive_cmd_desc);
	logger.info(output);
	logger.info("\n");
	
	#logger.info success or failed information.
	if status ==0:
		logger.info("desc %s to %s successful!" % (sys.argv[2],path));
	else:
		#set color: '\033[;31;40m'+...+'\033[0m'
		logger.error('\033[;31;40m'+"desc %s to %s failed!" % (sys.argv[2],path)+'\033[0m');
		#exit program.
		exit();
	logger.info("\n");

5. 字符串处理

	#this is fields list
	fields_list = [];
	with io.open(path,'r',encoding="utf-8") as f:
		fields = list(f);
		for line in fields:
			#remove start letter "|".
			line_rm_start_letter = line.strip("|");
			logger.info(line_rm_start_letter);
			#remove start and end space.
			pos = line_rm_start_letter.find("|");
			fields_list.append(line_rm_start_letter[0:pos].strip());
	logger.info("\n");
	
	#remove desc.log.
	remove_desc_log = 'rm %s' % (path);
	logger.info(remove_desc_log);
	status,output = commands.getstatusoutput(remove_desc_log);
	
	#logger.info success or failed information.
	if status == 0:
		logger.info("remove %s successful!" % (path));
	else:
		logger.error('\033[;31;40m'+"remove %s failed!" % (path)+'\033[0m');
		exit();
	logger.info("\n");
	
	#remove the first three lines.
	del fields_list[0:3];
	create = "";
	start_or_etl = "";
	if 'etl_load_date' in fields_list:
		start_or_etl = "etl_load_date";
		end_letter_pos = fields_list.index("etl_load_date");
		len = len(fields_list);
		del fields_list[end_letter_pos:len+1];
	if 'start_dt' in fields_list:
		start_or_etl = "start_dt";
		end_letter_pos = fields_list.index("start_dt");
		len = len(fields_list);
		del fields_list[end_letter_pos:len+1];		

6. 添加附加条件

	#add condition_field.
	condition_field = "%s" % (sys.argv[3]);
	if condition_field == "0":
		pass;
	else:
		start_or_etl = condition_field;
		
	for i in fields_list:
		#logger.info(len(i));
		logger.info(i);
	logger.info("\n");

7. 拼接字段

	#splice fields.
	fields_splice = "";
	for i in fields_list:
		fields_splice = fields_splice+"nvl(a.\`"+i+"\`,''),'|',";
	logger.info(fields_splice);
	logger.info("\n");

8. 建表

	#create table command.
	add_conditions = "%s" % (sys.argv[9]);
	if add_conditions == "and 1=1":
		create = "create table if not exists database.%s stored as textfile as select concat (%s from %s.%s a join %s b on trim(a.\`%s\`)=trim(b.\`%s\`) where b.code='%s' and a.\`%s\`>='%s' and a.\`%s\`<='%s' %s;" % (file_name,fields_splice,sys_argv[1],sys.argv[2],sys.argv[6],sys.argv[7],sys.argv[8],sys.argv[4],start_or_etl,sys.argv[10],start_or_etl,sys.argv[11],sys.argv[9]);
	else:
		create = "create table if not exists database.%s stored as textfile as select concat(%s from %s.%s a %s;" % (file_name,fields_splice,sys.argv[1],sys.argv[2],sys.argv[9]);
	logger.info(create);
	logger.info("\n");
	
	#execute the command.
	hive_cmd_create = 'beeline -u ip -n username -e "%s"' % (create);
	logger.info(hive_cmd_create);
	logger.info("\n");
	status,output = commands.getstatusoutput(hive_cmd_create);
	logger.info(output);
	logger.info("\n");
	
	#logger.info success or failed information.
	if status ==0:
		logger.info("create database.%s successful!" % (file_name));
	else:
		#set color: '\033[;31;40m'+...+'\033[0m'
		logger.error('\033[;31;40m'+"create database.%s failed!" % (file_name)+'\033[0m');
		#exit program.
		exit();
	logger.info("\n");

9. 计数

	#count table_new command.
	count = "select count(*) from database.%s;" % (file_name);
	logger.info(count);
	logger.info("\n");
	
	#execute the command.
	hive_cmd_count = 'beeline -u ip -n username -e "%s"' % (count);
	logger.info(hive_cmd_count);
	logger.info("\n");
	status,output = commands.getstatusoutput(hive_cmd_count);
	
	#logger.info success or failed information.
	if status ==0:
		logger.info("count database.%s successful!" % (file_name));
	else:
		#set color: '\033[;31;40m'+...+'\033[0m'
		logger.error('\033[;31;40m'+"count database.%s failed!" % (file_name)+'\033[0m');
		#exit program.
		exit();
	logger.info("\n");
	logger.info(output);
	logger.info("\n");

10. 提取数量

	#extract number.
	output_split = output.split("\n");
	number = output_split[7].strip("|").strip();
	result = re.match(r"^\d+$",number);
	if result:
		#logger.info count.
		logger.info("The number matched success!");
		logger.info('\033[1;33;40m'+"The count is : %s" % (number)+'\033[0m');
		logger.info("\n");
	else:
		logger.warning("The number matched failed!");

11. 抽样查看数据的准确性

	#show the first five data.
	first_five_data = "select * from database.%s limit 5;" % (file_name);
	logger.info(first_five_data);
	logger.info("\n");
	
	#execute the command.
	hive_first_five_data = 'beeline -u ip -n username -e "%s"' % (first_five_data);
	logger.info(hive_first_five_data);
	logger.info("\n");
	status,output = commands.getstatusoutput(hive_first_five_data);
	
	#logger.info success or failed information.
	if status == 0:
		logger.info("show the first five data of database.%s successful!" % (file_name));
	else:
		#set color: '\033[;31;40m'+...+'\033[0m'
		logger.error('\033[;31;40m'+"show the first five data of database.%s failed!" % (file_name)+'\033[0m');
		#exit program.
		exit();
	logger.info("\n");
	
	#logger.info the first five data.
	logger.info('\033[1;33;40m'+"the first five data are : \n\n%s" % (output)+'\033[0m');
	logger.info("\n");

12. 记录相关信息到文件

	#append to record.txt.
	output = open("%s%s" % (record_path,record_name),'a');
	if add_conditions == "and 1=1":
		output.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % ('database_name','table_name','code','extract_date','count','rel_tb_name','rel_field_name_pre','rel_field_name_after','date_pre','date_after'));
		output.write("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n" % (sys.argv[1],sys.argv[2],sys.argv[4],sys.argv[5],number,sys.argv[6],sys.argv[7],sys.argv[8],sys.argv[10],sys.argv[11]));
	else:
		output.write("%s\t%s\t%s\t%s\t%s\t%s\n" % ('database_name','table_name','code','extract_date','count','add_conditions'));
		output.write("%s\t%s\t%s\t%s\t%s\t%s\n" % (sys.argv[1],sys.argv[2],sys.argv[4],sys.argv[5],number,sys.argv[9]));
	output.close();
	
	#logger.info the data extraction success information.
	logger.info('\033[1;35;40m'+"*****Data extract success!*****"+'\033[0m');
	logger.info('\033[1;35;40m'+"*****Made by sgqhappy in %s!*****" % (sys.argv[5])+'\033[0m');
	logger.info("\n");

13. 执行python脚本

python data.py database table 0 1000 20181101 rel_table rel_field rel_field "and 1=1" 20180731 20180801
2016-07-15 10:54:30 carrie1995 阅读数 196
  • 21天搞定分布式Python网络爬虫

    【本课程如何让你系统掌握python爬虫?】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: * 网络请求:模拟浏览器的行为从网上抓取数据。 * 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 * 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 重点 :通过爬虫进阶的知识点我们能应对大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度! 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 1、面向企业实际需求,为零基础从入门到进阶中级python爬虫工程打造。 2、从最基本的网络抓包开始讲起,到网络请求,再到数据解析和数据存储,再到反反爬虫和分布式爬虫,技术要点十分全面。 3、边学边实做实战项目,从易到难,打好基础,层层深入。不同的实战项目锻炼不同的技能点,让你牢牢掌握爬虫工程师的核心技能。 4、课程以视频+作业+技术辅导的方式学习,确保每个学生对每个知识点都能学懂学透!

    7310 人正在学习 去看看 王涛

1.TypeError:在我的代码中,遇到这个问题是主要是因为html文件的错误,然后etree.HTML()就会出现错误,所以在代码中加入异常处理,遇到这样的html直接跳过
2.在html.xpath()函数中,有些标签找不到元素,但是标签是存在的,不明白为什么会出现这样的问题。一切都归结于html写的不规范吧~等我以后找到原因再来更新
XPath是一种表达式语言,它的返回值可能是节点,节点集合,原子值,以及节点和原子值的混合等。具体细节请看:
http://www.cnblogs.com/Loofah/archive/2012/05/10/2494036.html
拖得时间太久,都已经忘记了还有那些问题,等我想起来再来更新。
注意:在写数据提取的时候一定要做异常处理,提取一个html还好,要是批量处理,就完蛋了,尤其是在一个项目中,你的代码跑着跑着崩溃了,后面要用数据的小伙伴估计想把你团成团让你以一种圆润的方式离开。

2015-12-17 16:42:40 u012420309 阅读数 817
  • 21天搞定分布式Python网络爬虫

    【本课程如何让你系统掌握python爬虫?】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: * 网络请求:模拟浏览器的行为从网上抓取数据。 * 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 * 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 重点 :通过爬虫进阶的知识点我们能应对大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度! 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 1、面向企业实际需求,为零基础从入门到进阶中级python爬虫工程打造。 2、从最基本的网络抓包开始讲起,到网络请求,再到数据解析和数据存储,再到反反爬虫和分布式爬虫,技术要点十分全面。 3、边学边实做实战项目,从易到难,打好基础,层层深入。不同的实战项目锻炼不同的技能点,让你牢牢掌握爬虫工程师的核心技能。 4、课程以视频+作业+技术辅导的方式学习,确保每个学生对每个知识点都能学懂学透!

    7310 人正在学习 去看看 王涛

人脸检测,提供的数据库是sqlite格式,而且数据分散在几个table中,提取需要的数据到txt中。


用专门的软件查看数据格式。但导出不能为直接为txt。可以先导成其他格式再转成txt。可这种方式还不如直接转成。


python中有专门处理sqlite的库。

代码如下:

import sqlite3

with sqlite3.connect('aflw.sqlite') as conn: #连接
    cursor1 = conn.cursor()
    cursor1.execute("select filepath from FaceImages;")
    
    cursor2 = conn.cursor()
    cursor2.execute("select x, y, w, h from FaceRect;")    
    
    res = [row1+row2 for row1 in cursor1.fetchall() for row2 in cursor2.fetchall()]

out = open('aflw_filepath_rect.txt','w')    
for line in res:
    out.write(str(line))
    out.write('\n')
out.close()
    

最后生成数据格式为:








2019-09-10 21:22:56 qq_21201267 阅读数 386
  • 21天搞定分布式Python网络爬虫

    【本课程如何让你系统掌握python爬虫?】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: * 网络请求:模拟浏览器的行为从网上抓取数据。 * 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 * 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 重点 :通过爬虫进阶的知识点我们能应对大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度! 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! 1、面向企业实际需求,为零基础从入门到进阶中级python爬虫工程打造。 2、从最基本的网络抓包开始讲起,到网络请求,再到数据解析和数据存储,再到反反爬虫和分布式爬虫,技术要点十分全面。 3、边学边实做实战项目,从易到难,打好基础,层层深入。不同的实战项目锻炼不同的技能点,让你牢牢掌握爬虫工程师的核心技能。 4、课程以视频+作业+技术辅导的方式学习,确保每个学生对每个知识点都能学懂学透!

    7310 人正在学习 去看看 王涛

文章目录

数据1

数据目标:曲线图
在这里插入图片描述

  • F12,如图位置输入JSON.stringify(dataSeries.dataPoints)

在这里插入图片描述

  • copy,粘贴到data.txt
    在这里插入图片描述
    数据是一个列表,里面是多个字典

编写程序如下:

import json as js
datafile = 'data1.txt'
resultfile = 'result.txt'
result = open(resultfile,'w',encoding='utf-8')
with open(datafile,'r',encoding='utf-8') as file:
    data = js.load(file)
for data_i in data:
    for k,v in data_i.items():
        if k == 'x':
            strline = v[0:10] + '   '
        if k == 'y':
            strline = strline + str(v)
    result.write(strline+'\n')
result.close()

得到数据结果
在这里插入图片描述

数据2

数据目标:曲线图

  • 查看图形源代码
    在这里插入图片描述
  • 找到数据所在行
    在这里插入图片描述
  • 复制到文本
    在这里插入图片描述
  • 编写程序
import json as js
datafile = 'data.txt'
resultfile = 'result.txt'
result = open(resultfile,'w',encoding='utf-8')
with open(datafile,'r',encoding='utf-8') as file:
    data = js.load(file)
for data_i in data:
    strline = ''
    for v in data_i:
            strline = strline + str(v) + '    '
    result.write(strline+'\n')
result.close()
  • 得到结果
    在这里插入图片描述

python数据提取方法

阅读数 254

没有更多推荐了,返回首页