大数据 爬虫Python AI Sql计算机玩转大数据

python学习笔记0810

2019-08-11  本文已影响0人  f9fa28843d13
# -*- coding: utf-8 -*-
"""
Created on Fri Aug  9 23:04:28 2019

@author: Administrator
"""

"""
可以做爬虫的语言:
1.PHP:多进程,多线程支持不好
2.java:后端语言,可以做爬虫,最主要的竞争对手,代码比较臃肿,重构成本大
3.c、c++,能用这些语言做爬虫能力比较强,水平比较高
4.python,爬虫方面的内容,世界上最美丽的语言,语法简单,代码优美,学习成本低,支持第三方模块比较多
通用爬虫:平常所接触的百度,360,搜狐,谷歌,必应。。。
原理:
    1.抓取网页
    2.采集数据
    3.数据处理
    4.提供检索服务
爬虫:baiduspider
通用爬虫如何抓取新网站:
1.主动向百度提交url
2.设置友情链接
3.百度会和DNS服务商合作,抓取新网站
检索排名
    竞价排名
    根据pagerank值、访问量、点击量(seo)
    robots协议:robots.txt
    如果不想让百度爬取,可以编写robots.txt,这个协议仅仅是口头上的协议
    自己写的爬虫程序不需要遵从
聚焦爬虫:根据特定需求抓取指定数据
    思路:
        代替浏览器上网
        网页的特点:
        1.网页都有自己唯一的url
        2.网页内容都是html结构的
        3.使用的都是http,http协议
        爬取步骤:
            1.给一个url
            2.写程序,模拟浏览器访问url
            3.解析内容,提取数据
    环境:
        windows环境
        linux环境
        python3.6  64位的
        sublime pycharm
课程内容:
    1.使用到第三方库urlliib/requests/bs4...
    2.解析网页内容的知识:
    正则表达式、bs4、xpath、josnpath
    3.涉及到动态html
    selenium+phantom、Chromeheadless
    4.scrapy框架
    高性能框架使用
    5.scrapy-redis组件
    redis,分布式爬虫
    6.涉及到爬虫、反爬虫、反反爬虫的一些内容
    UA、代理、验证码、动态页面等
http协议:
什么是协议?黑话、暗号
http协议:网站原理
    应用层的协议 ftp(21)
    http(80)\https(443) ssh(22) mysql(3306)
    redis(6379) mongo(27017)
    
"""
"""
python新东西:
这里做笔记

"""
print('hello python!')
# -*- coding: utf-8 -*-
"""
Created on Sat Aug 10 00:33:17 2019

@author: Administrator
"""

"""
注释法:
1.#仅能注释一行,可以注释掉一部分
2.三引号注释方法,可以是单引号或者双引号
标识符:标注某个东西的符号
第一个字符可以是字母或者下划线——不能是数字
除第一个字符以外的其他字符可以是字母、下划线或数字
变量:
"""
'''
a = 5
print(a)
'''
'''
a+=b
a=a+b
'''
'''
list列表[]
abc=['my','you']
abc[1]
print(abc[0])
abc[0]='us'
print(abc)
'''
'''
元组tuple()
元组与列表的不同:
    1.列表中的元素支持修改,元组中的元素不支持修改
cde=('my','you')
 #'tuple' object is not callable
 
print(cde[0])
'''
'''
a='hshssadgfasfahj'
b='iwqedjasbasjdf'
sa=set(a)#集合是大括号
print(sa)
sb=set(b)
print(sb)
print(sa&sb)#交集
print(sa|sb)#并集
'''
#字典
#格式:{key1:value1,key2:value2}
'''
d1={'name':'john','sex':'man'}
print(d1)
a=d1['name']
print(a)#根据键,找出对应的值
'''
#运算符
'''
print(5+6)
#字符串与变量的连接,需要用到数学中的+号
p='python'
a='hello '+p+'!'
print(a)
#除法不用余数//
print(7//2)
#除法只要余数%
print(7%5)
'''
#缩进,tab
'''
a=10
b=15
if(a<9):
    print(a)
    if(b<9):
        print(b)
elif(a<18):
    print('a大于9小于18,耶!')
'''
#编程并不吓人
#放开胆子去练
#python控制流
'''
三种控制流:
    1.顺序结构
    2.条件分支结构
    3.循环结构
    4.中断结构:break、continue
    if语句:
'''
#if语句,if和else后面都要加:,老师if里的等于喜欢双等于
#一个等号是赋值,两个等号是判断
#if后不加括号那就加空格,要么直接加括号
#python里加标点符号目前仅仅是if那些
'''
a=6
if(a==7):
    print(a)
elif a<7:
#elif记住可以加多个,冒号记住
    print('a小于7')
else:
    print('a不等于7')
'''
#while语句,一种循环结构语句
#希望输出8次hello
'''
a=0
while a<8:
    print('hello')
    a+=1
    '''
#进入死循环的话,用ctrl+c
#另一种循环语句,for语句,可以依次遍历列表里的东西
'''
a=['b','c','d','e']
for i in a:
    print(i)
'''
#用for输出8次hello
'''
for i in range(0,100):
    if i<8:
        print('hello')
        
'''
'''
for i in range(0,8):
    print('hello')
'''
#字符串一定要记得加引号
#中断结构:中途退出,continue、break
#中断其中一次循环,使用continue语句
#中断一个循环,使用break语句
'''
for i in  range(0,8):
    if i==6:
        continue
    print(i)
    print('hello')
'''
'''
for i in range(0,8):
    if i==6:
        break
    print(i)
    print('hello')
'''
#输出乘法口诀
'''
for i in range(1,10):
    for j in range(1,10):
        print(i*j)
'''
#最好能画一个流程图
#以上是错误的
'''
for i in range(1,10):
    for j in range(1,i+1):
#此处+1非常有技术含量
#变量和字符串连接需要加+号
        print(str(i)+'*'+str(j)+'='+str(i*j)+'  ',end='')
#'int' and 'str'连接需要把int转化为str
#现在,中间加上空行更具可读性,所以:
    print()
'''
    
#练习:逆向输出乘法口诀表
for i in [9,8,7,6,5,4,3,2,1]:
    for j in range(1,i+1):
        print(str(i)+'*'+str(j)+'='+str(i*j)+' ',end='')
    print()

    

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 10 12:15:08 2019

@author: Administrator
"""
#乘法口诀表的实现
'''
for i in range(1,10):
    for j in range(1,i+1):
        re=i*j
        print(str(i)+'*'+str(j)+'='+str(re)+' ',end='')
    print()
'''
#逆向实现乘法口诀表
#python函数:功能的封装,大大提高编程的效率,可以做一些只有自己用的函数,想用的时候就自己用
#局部变量与全局变量:变量是有生效范围的,作用域。从开始到程序最末的变量叫全局变量,作用域只在局部的变量叫做局部变量
#作用域:
'''
i=10
def func():
    global j
    j=10
 
    print(j)
print(j)
'''
#怎么调试,把程序后面的部分加注释,再在中间加输出,二分段点
#函数的定义与调用,以及文档字符串
#函数的定义和调用
#def 函数名([参数]):(命名要有规律)
'''
def abc():
    print('def!')
print(abc())
'''
'''
如果需要让函数与外界有数据的传递,需要使用参数。
在函数定义时使用的参数是形参,在函数调用时使用的参数是实参
'''
#形参和实参
'''
def function1(a,b):
    if a>b:
        print(str(a)+'大')
    else:
        print(str(b)+'大')
print(function1(6,5))
'''
#python模块
'''
1.什么是python模块
    系统中自带的模块在安装目录的lib目录下
    模块里的函数叫做模块的方法
    python模块的导入:
        import 模块名
        from...import...
        
2.python模块的导入
3.自定义python模块
'''
'''
import urllib
from urllib.request import urlopen
#爬取百度首页
data1=urllib.request.urlopen('http://www.baidu.com').read()
#不停地精确定位,以上
print(len(data1))
'''
'''
data2=urllib.request.urlopen('https://www.bilibili.com/')
print(len(data2))
'''

#import urllib
'''
from urllib import request
data3=request.urlopen('http://jd.com').read()
print(len(data3))
'''
'''
import urllib
data4=urllib.request.urlopen('http://jd.com').read()
print(len(data4))
#import什么,就从哪里开始写
'''
#自定义模块的使用,自定义的模块放到lib里
'''
import shen
print(shen.hello())
'''
'''
import shen
data1=shen.hello()
print(data1)
'''
#python文本操作
#pyton文件操作
#手工打开、写入、读取文件等操作
#使用python对文件打开、关闭、读取、写入等操作,使用python进行文件操作可以自动对文件进行处理
#open()文件的打开与创建,有就打开,没有就创建并打开
#open(路径,w/r/wb)
#open('f://exercise1.csv','wb')
'''
fh1=open('f://exercise1.txt','w')
#open('f://exercise1.py','wb')
fh2=open('f://exercise2.txt','w')
fh3=open('f://exercise3.txt','w')
#文件内容的写入
contents1='我是文件的内容'
fh1.write(contents1)#或者这里直接加引号字符窜
fh1.write('6bu6')
fh1.close()
fh2.close()
fh3.close()
'''
'''
fh2=open('f://exercise2.txt','w')
fh2.write('密码')
#一定要记得关闭,以防以后使用
fh2.close()
#文件的读取

fh1.close()
'''
'''
data3=open('f://exercise3.txt','r').read()
print(data3)
'''
#fh3=open('f://exercise3.txt','r')
#data3=fh3.read()
#print(data3)
#按行读取
'''
line1=fh3.readline()
print(line1)
'''
'''
fh3=open('f://exercise3.txt','r')
while True:
    line=fh3.readline()
    if len(line)==0:
        break
    else:
        print(line)
fh3.close()
'''
#fh3=open('f://exercise3.txt','r')
#fh3.close()
#异常处理
#try:
#except Exception as 自定义名称,Exception首字母大写
'''
try:
    print('mmy')
    printav('mmy')
except Exception  as  er:
    print(er)
print('hello')
'''
#调试:二分法
#作业:将多个excel表格里面的内容合并到一个文件中
'''
读取XLS,XLSX文件
'''
'''
def readExcelFile(filename):
    # 打开工作表
    workbook = xlrd.open_workbook(filename=filename)
    # 用索引取第一个工作薄
    booksheet = workbook.sheet_by_index(0)
    # 返回的结果集
    for i in range(booksheet.nrows):
        print(booksheet.row_values(i))
'''
'''
#将多个excel文件合并成一个
import xlrd
import xlsxwriter
def open_xls(file):
    fh=xlrd.open_workbook(file)
    return fh  
#获取excel中所有的sheet表
def getsheet(fh):
    return fh.sheets()
#获取sheet表的行数
def getnrows(fh,sheet):
    table=fh.sheets()[sheet]
    return table.nrows
#读取文件内容并返回行内容
def getFilect(file,shnum):
    fh=open_xls(file)
    table=fh.sheets()[shnum]
    num=table.nrows
    for row in range(num):
        rdata=table.row_values(row)
        datavalue.append(rdata)
        return datavalue
#获取sheet表的个数
def getshnum(fh):
    x=0
    sh=getsheet(fh)
    for sheet in sh:
        x+=1
        return x
if __name__=='__main__':
#定义要合并的excel文件列表
    allxls=['F:/test/excel1.xlsx','F:/test/excel2.xlsx']
#存储所有读取的结果
    datavalue=[]
    for fl in allxls:
        fh=open_xls(fl)
        x=getshnum(fh)
            for shnum in range(x):
                print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")
                rvalue=getFilect(fl,shnum)
 #定义最终合并后生成的新文件
endfile='F:/test/excel3.xlsx'
wb1=xlsxwriter.Workbook(endfile)
 #创建一个sheet工作对象
ws=wb1.add_worksheet()
for a in range(len(rvalue)):
    for b in range(len(rvalue[a])):
        c=rvalue[a][b]
        ws.write(a,b,c)
wb1.close()
print("文件合并完成")
'''
'''
openpyxl 
wb1 = openpyxl.load_workbook() 
wb2 = openpyxl.load_workbook() 
wb3 = openpyxl.load_workbook() 
wb = openpyxl.Workbook() 
wsheet = wb.active (wb):     
    sheet = wb.active     
    column = sheet.max_column     
    column (wbcolumn):     
        ws = wb.active     
    row_obj (ws.rows):         
        t = (row_obj)         
temp = []         
j (column):             
    temp.append(t[j].value)         
    wsheet.append(temp)     
    column1 = get_column(wb1) 
    column2 = get_column(wb2) 
    column3 = get_column(wb3) 
    do_append(wb1column1) 
    do_append(wb2column2) 
    do_append(wb3column3) 
wb.save()
'''
'''
import xlrd
help(xlrd)
'''
import xlrd,xlsxwriter
#设置要合并的所有文件 
allxls=["F:/第一个测试文件.xls","F:/第二个测试文件.xls","F:/第三个测试文件.xls"]
#设置合并到的文件 
endxls ="F:/endxls.xls"
#打开表格 
def open_xls(file):
    try:    
        fh=xlrd.open_workbook(file)  
        return fh
    except Exception as e    
    print(str("打开出错,错误为:"+e))
#获取所有sheet 
def getsheet(fh):
    
    # -*- coding: utf-8 -*-
"""
Created on Sat Aug 10 22:01:52 2019

@author: Administrator
"""

#爬虫初识
#实现多个excel的合并
#先把多个sheet的内容合并在一起
'''
import xlrd,xlsxwriter
#设置要合并的所有文件 
allxls=["F:/第一个测试文件.xls","F:/第二个测试文件.xls","F:/第三个测试文件.xls"]
#设置合并到的文件 
endxls ="F:/endxls.xls"
#打开表格 
def open_xls(file):
    try:    
        fh=xlrd.open_workbook(file)  
        return fh
    except Exception as e:   
        print(str("打开出错,错误为:"+e))
#获取所有sheet 
def getsheet(fh):
    return fh.sheets()
#读取某个sheet的行数 
def getnrows(fh,sheet): 
    table=fh.sheets()[sheet]     
    content=table.nrows     
    return content
#读取某个文件的内容并返回所有行的值 
def getfilect(fh,fl,shnum):     
    fh=open_xls(fl)     
    table=fh.sheet_by_name(shname[shnum])     
    num=getnrows(fh,shnum)     
    lenrvalue=len(rvalue) 
    for row in range(0,num):         
        rdata=table.row_values(row)         
        rvalue.append(rdata)
    #print(rvalue[lenrvalue:])     
    filevalue.append(rvalue[lenrvalue:])    
    return filevalue #存储所有读取的结果 filevalue=[]
#存储一个标签的结果 
svalue=[] 
#存储一行结果 
rvalue=[] 
#存储各sheet名 
shname=[] 
#读取第一个待读文件,获得sheet数 
fh=open_xls(allxls[0]) 
sh=getsheet(fh) 
x=0 
for sheet in sh:     
    shname.append(sheet.name)     
    svalue.append([])     
    x+=1 
    #依次读取各sheet的内容 
    #依次读取各文件当前sheet的内容 
    for shnum in range(0,x):
         for fl in allxls:         
             print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个标签的…")         
             filevalue=getfilect(fh,fl,shnum)     
             svalue[shnum].append(filevalue)
#print(svalue[0])    
#print(svalue[1]) 
#由于append具有叠加关系,分析可得所有信息均在svalue[0][0]中存储 
#svalue[0][0]元素数量为sheet标签数(sn)*文件数(fn) 
sn=x 
fn=len(allxls) 
endvalue=[] 
#设置一个函数专门获取svalue里面的数据,即获取各项标签的数据 
def getsvalue(k):   
    for z in range(k,k+fn):         
        endvalue.append(svalue[0][0][z])     
        return endvalue 
#打开最终写入的文件 
wb1=xlsxwriter.Workbook(endxls) 
#创建一个sheet工作对象 
ws=wb1.add_worksheet() 
polit=0 
linenum=0 
#依次遍历每个sheet中的数据 
for s in range(0,sn*fn,fn): 
     thisvalue=getsvalue(s)     
     tvalue=thisvalue[polit:]     
     #将一个标签的内容写入新文件中     
for a in range(0,len(tvalue)):         
    for b in range(0,len(tvalue[a])):             
        for c in range(0,len(tvalue[a][b])):    
             #print(linenum)                 
             #print(c)                 
             data=tvalue[a][b][c]                 
             ws.write(linenum,c,data)             
             linenum+=1     
             #叠加关系,需要设置分割点     
             polit=len(thisvalue) 
wb1.close()    
'''
#爬虫原理
#正则表达式-非常重要:进行数据筛选的表达式
#xpath表达式
#原子:正则表达式中最基本的组成单位
#常见原子类型:
'''
1.普通字符作为原子
2.非打印字符作为原子
3.通用字符作为原子
4.原子表
'''
#以普通字符作为原子
'''
import re
pat='yue'
string1='http://yum.iqianyue.com'
rst1=re.search(pat,string1)
print(rst1)
string2='abcdefg'
rst2=re.search(pat,string2)
print(rst2)
#非打印字符作为原子
#\n换行符
#\t制表符,作业中为了对齐
#注意,三引号支持换行
pat2='\n'

rst3=re.search(pat2,string3)
print(rst3)
'''
#re.search(条件,范围)区分大小写
#通配符\w表示任意一个字母、数字、下划线
#\d代表一个十进制数
#\s代表任意一个空白字符
#\W匹配一个除了\w之外的所有字符
#其余,以此类推
'''
import re
pat1='\w\dpython\w'
string1='abcdefg'
rst1=re.search(pat1,string1)
print(rst1)
string2='abcd5pythonwgf'
rst2=re.search(pat1,string2)
print(rst2)
'''
'''
#原子表
import re
pat='pyth[jsz]n'#可以配出来三种选项,原子表
string='abcdefgpythsnabcdefg'
rst=re.search(pat,string)
print(rst)
#原子表中的三个东西地位是平等的,只能代替一个东西,如下:
import re
pat='pyth[jsz]n'#可以配出来三种选项,原子表
string='abcdefgpythjsnabcdefg'
rst=re.search(pat,string)
print(rst)
'''
#元字符,正则表达式中具有一些特殊含义的字符,比如重复n次前面的字符
#.匹配任意多个字符
#^匹配字符串中开始的位置
#$匹配字符串中结束的位置
#*表示出现多次,0.1.2.3次多次's*'s出现多次s/ss/sss/ssss/sssss
#?0.1次's?'s/ss
#+1.2.3次,注意这几个都分别重复多少次
'''
* 0.1.多
?0.1
+ 1.多
'''
#t{n}前面的原子重复n次,表示n个t
#t{n,}前面的原子至少重复n次,表示至少n个t
#t{n,m}前面的原子至少重复n次,至多出现n个t
#t|st或s
#()提取某一个内容
'''
import re
pat='.python...'
string='abcdpythonefg'
rst=re.search(pat,string)
print(rst)
'''
#re.search()仅会将第一个满足条件的内容匹配出来
'''
import re
pat='php|python'#或,php和python处于同等地位
string='abcphpdefgpython'
rst=re.search(pat,string)
print(rst)
'''
#模式修正符:即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能
#I M L U S
'''
import re
pat1='python'
pat2='python'
string='abcdPythonefg'
rst1=re.search(pat1,string)
print(rst1)
rst2=re.search(pat2,string,re.I)#,re.I不区分大小写
print(rst2)
'''
#贪婪模式与懒惰模式
#贪婪模式:尽可能多的去匹配
#懒惰模式:尽可能少的去匹配
'''
import re
pat1='p.*y'#贪婪模式,粗犷定位
pat2='p.*?y'#懒惰模式,精准定位
string='abcdpythonefgpy'
rst1=re.search(pat1,string)#贪婪模式
print(rst1)
rst2=re.search(pat2,string)#懒惰模式
print(rst2)
'''
#正则表达式函数
#re.match()必须从开始开始匹配,第一个必须就得一样
#re.search()匹配,满足条件,从左往右,只能出现一个结果-缺陷
#re.sub()替换
#全局匹配函数:
#re.compile(pat1).findall(string)
#re.compile(表达式),findall(字符串)
#re.compile(条件),findall(区域)
'''
import re
pat1='python'
string='abcdpythonefgpythonhij'
rst1=re.findall(pat1,string)
print(rst1)
rst2=re.compile(pat1).findall(string)
print(rst2)
'''
#以上两种效果相同
#常见的正则实例:
#如何匹配.com或.cn网址,以及如何匹配电话号码
'''
import re
pat='[a-zA-Z]+://[^\s]*[.com|.cn]'
string='<a href="http://www.baidu.com>hasghj</a>'
rst=re.findall(pat,string)
print(rst)
'''
#简单的爬虫:爬取csdn,使用urllib,找到课程的qq群
'''
import re
pat='<p>(.*?)</p>'
import urllib.request
data=urllib.request.urlopen('https://edu.csdn.net/huiyiCourse/detail/215').read()
QQ=re.compile(pat).findall(str(data))
print(QQ)
'''
#作业
#提取出版社信息并写入文件中
#https://read.douban.com/provider/all
#提取所有出版社,并过滤无关信息




上一篇下一篇

猜你喜欢

热点阅读