python第一篇
一. 基础:
1.开发语言:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。高级(依赖于C语言):Java(执行效率比python高),python(优势:代码开发效率高),PHP(写网站页面,快速搭建,有局限性),
Java,python:可以写网页,也可以写后台功能
低级:c语言,汇编语言
2.机器码和字节码
机器码:计算机可以直接识别的码
字节码:高级语言规则形成的码
3.python版本很多,javapython,c#python不如cpython执行效率高,一般常用cpython;
pypy:用cpython开发的python,对python的升级,只需要学习python的规则,执行效率高(速度快),但是不是主流语言,功能还不够完善
4.python的数据类型:
整型(整数,长度不受限制)
布尔类型(false,true)
浮点型(小数)
e记法(特变大或特别小的数:1.5e4=15000)
类型转换:整数:int() 字符串:str() 浮点数:float()
注意:浮点型转换为整数型采取截断法,如a=int(5.99),则a=5;
5.可以实现爬虫的语言
php:多线程支持不好
java:代码臃肿,重构成本大
c,c++:能力的体现,不是最好的选择
python:支持的模块多,有非常强大的框架
6.几个概念
通用爬虫:百度,360,搜狐,谷歌。。。
原理:抓取网页----采集数据----数据处理----提供检索服务
通用爬虫如何抓取新网站:
(1)主动提交url
(2)设置友情链接
(3)百度会和DNS服务商合作,抓取新网站
(4)检索排名:按照竞价排名,根据pagerank值,点击量,访问量排名
不想让百度爬取:编写robots协议
例如:淘宝的robots协议:http://www.taobao.com/robots.txt 显示可以爬取的内容
聚焦爬虫:根据特定的需求抓取指定的数据
原理:网页的特点:都有自己唯一的url,网页内容都是html结构,使用的都是http,https协议
给一个url----写程序,模拟浏览器访问url(需要用到库)----解析内容,提取数据(正则表达式,bs4,xpath,jsonpath)
7.环境:Windows,Linux
8.协议:双方规定的传输形式,属于应用层协议
客户端发送请求,服务端与数据库(mysql,redis,mongode)进行交互,响应内容
http端口号:80,https端口号:443 两者区别和原理:
https://blog.csdn.net/xionghuixionghui/article/details/68569282
https://juejin.im/entry/58d7635e5c497d0057fae036
9.http协议详解:http://www.cnblogs.com/10158wsj/p/6762848.html
url只能由特定的字符组成:字母,数字,下划线;如果出现空格,中文等,就要对其进行编码
10.抓包:fiddler
11.urllib库:模拟浏览器发送请求的库,python自带
字符串和二进制之间的转换:encode() 字符串-----> 二进制
decode() 二进制------> 字符串
如果小括号里不写参数,默认是utf8,如果写,就写gbk(根据网页的编码是什么类型:右键----查看网页源代码)
urllib.request: (举例1)
urlopen(url) 向url发送请求(举例1.方法1)
urlretrieve(url,image_path) 向url发送请求,直接写入(举例1.方法2)
urllib.parse:
quote(url) 将非法的url(含有中文字符)进行编码 (举例2)
unquote(url) 将编码过的url进行解码
urlencode(字典data) 给一个字典,将字典拼接为query_string,并将进行编码 (举例3)
response: (举例4)
read() 读取响应内容,是字节类型(二进制类型)
geturl() 获取请求url
getheaders() 获取头部信息
getcode() 获取状态码
readlines() 按行读取,返回类型都是字节类型
举例1:下载图片:只能写入本地二进制的格式
方法1:
import urllib.request image_url='http://hellorfimg.zcool.cn/preview/179504174.jpg' response=urllib.request.urlopen(image_url) with open('1.jpg','wb') as fp: fp.write(response.read())
方法2:
import urllib.request image_url='http://hellorfimg.zcool.cn/preview/179504174.jpg' urllib.request.urlretrieve(image_url,'2.jpg') #直接写入
举例2:
import urllib.parse image_url='http://hellorfimg.zcool.cn/preview/图片.jpg' ret=urllib.parse.quote(image_url) #将非法的url编码 print(ret) re=urllib.parse.unquote(ret) #将编码后的url解码 print(re)
举例3:
不用urlencode的拼接方法
import urllib.parse url='http://wwww.baidu.com/index.html?参数1=1&参数2=2&参数3=3' 参数1='1' 参数2='2' 参数3='3' data={ '参数1':参数1, '参数2':参数2, '参数3':参数3, } #字典 #遍历字典 lt=[] for k,v in data.items(): lt.append(k+'='+str(v)) query_string='&'.join(lt) url=url+'?'+query_string print(url)
用urlencode的拼接方法:
import urllib.parse url='http://wwww.baidu.com/index.html' 参数1='1' 参数2='2' 参数3='3' data={ '参数1':参数1, '参数2':参数2, '参数3':参数3, } #字典 query_string=urllib.parse.urlencode(data) print(query_string) url=url+'?'+query_string print(url)
举例4:
import urllib.request
url='http://www.baidu.com'
response=urllib.request.urlopen(url) #向url发送请求,相应是返回值的形式
print(response.read().decode()) #获取响应,将二进制转化为字符串
with open('baidu.html','w',encoding='utf8') as fp: fp.write(response.read().decode()) #写入baidu.html print(response.geturl()) #获取请求url
12.get方式
import urllib.parse import urllib.request word=input('请输入想要搜索的内容:') url='http://www.baidu.com/s?' #参数 data={ 'wd':word, #输入的内容 'tn':'25017023_13_pg', 'ssl_s':'1', 'ssl_c':'16a401eba80', } #在百度搜索一个内容之后得到 query_string=urllib.parse.urlencode(data) url=url+query_string #发送请求 response=urllib.request.urlopen(url) with open('baidu2.html','wb') as fp: fp.write(response.read())
13.构建请求头部信息(反爬第一步)
python向浏览器发送请求,浏览器检测到头部信息为:python-urllib/3.6 , 如果有反爬虫,则无法爬取,因为浏览器根据检测到的头部信息判定这是爬虫程序,会禁止爬取数据;这时,python-urllib/3.6 需要伪装自己的UA,让服务端认为是浏览器在上网
UA大全:https://blog.csdn.net/rookie_is_me/article/details/81634048
伪装UA:构建请求对象:urllib.request.Request(url=url,headers=headers) (通过这个类创建一个请求对象)
import urllib.parse import urllib.request import ssl url='http://www.baidu.com/' #伪装头部 headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36', } #构建请求对象 request=urllib.request.Request(url=url,headers=headers) #发送请求 response=urllib.request.urlopen(request) with open('baidu3.html','wb') as fp: fp.write(response.read())
