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
#提取所有出版社,并过滤无关信息