python学习(1)

1、python简单优雅
Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。
搭建环境

确认系统安装的Python版本
python --version
Python 2.7.12

安装开发Web App需要的第三方库:
前端模板引擎jinja2:
sudo apt-get install python-jinja2

安装MySQL
安装前先更新软件包列表
sudo apt update
在Ubuntu 16.04上安装MySQL
sudo apt-get install mysql-server mysql-client

运行MySQL初始化安全脚本
sudo mysql_secure_installation脚本设置的东西:更改root密码、移除MySQL的匿名用户、禁止root远程登录、删除test数据库。使用上面的这些选项可以提高MySQL的安全。

使用如下命令查询是否安装成功
sudo netstat -tap | grep mysql
tcp        0      0 localhost:mysql         *:*                     LISTEN      15208/mysqld  

停止MySQL数据库服务:
sudo systemctl stop mysql.service
sudo service mysql stop
启动MySQL数据库服务:
sudo systemctl start mysql.service
sudo service mysql start
重启MySQL数据库服务:
sudo systemctl restart mysql.service
sudo service mysql restart
查看MySQL运行状态:
sudo systemctl status mysql.service
sudo service mysql status
MySQL的配置文件:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
或者sudo vim /etc/mysql/my.cnf

安装python依赖
sudo apt-get install libmysqlclient-dev
MySQL的Python驱动程序
sudo apt-get install mysql-connector-python
或者 sudo apt-get install python-mysql.connector
mysql-connector-python:是MySQL官方的纯Python驱动;
sudo pip install mysql-python
(安装之前要安装libmysqlclient-dev)
MySQL-python:是封装了MySQL C驱动的Python驱动。

Linux上,需要编辑MySQL的配置文件,把数据库默认的编码全部改为UTF-8sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
[client]
default-character-set = utf8
[mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci
重启MySQL
sudo systemctl restart mysql.service
验证
mysql> show variables like '%char%';

远程访问
第一步:
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
注释掉这行,如:#bind-address = 127.0.0.1
或者改为: bind-address = 0.0.0.0
允许任意IP访问;
或者自己指定一个IP地址。
重启MySQL
sudo systemctl restart mysql.service
第二步:
授权用户能进行远程连接
mysql > grant all privileges on *.* to root@"%" identified by "password" with grant option;
mysql > flush privileges;
第一行命令解释如下,*.*:第一个*代表数据库名;第二个*代表表名。这里的意思是所有数据库里的所有表都授权给用户。root:授予root账号。“%”:表示授权的用户IP可以指定,这里代表任意的IP地址都能访问MySQL数据库。“password”:分配账号对应的密码,这里密码自己替换成你的mysql root帐号密码。
第二行命令是刷新权限信息,也即是让我们所作的设置马上生效。

2、网络爬虫
网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是URL。

 URL就是同意资源定位符(Uniform Resource Locator),它的一般格式如下(带方括号[]的为可选项):
    protocol :// hostname[:port] / path / [;parameters][?query]#fragment
    URL的格式由三部分组成:
    (1)protocol:第一部分就是协议,例如百度使用的就是https协议;
    (2)hostname[:port]:第二部分就是主机名(还有端口号为可选参数),一般网站默认的端口号为80,例如百度的主机名就是www.baidu.com,这个就是服务器的地址;
    (3)path:第三部分就是主机资源的具体地址,如目录和文件名等。

3、网络爬虫实例
python 2.7
ubuntu 16.04
我们可以使用urlib这个组件抓取网页

#coding:utf8

import urllib

response = urllib.urlopen('http://www.baidu.com')
html = response.read()
print(html)

首先我们调用的是urllib库里面的urlopen方法,传入一个URL,这个网址是百度首页,协议是HTTP协议,当然你也可以把HTTP换做FTP,FILE,HTTPS 等等,只是代表了一种访问控制协议,urlopen一般接受三个参数,它的参数如下:
urlopen(url, data, timeout)
第一个参数url即为URL,第二个参数data是访问URL时要传送的数据,第三个timeout是设置超时时间。
第二三个参数是可以不传送的,data默认为空None,timeout默认为 socket._GLOBAL_DEFAULT_TIMEOUT
第一个参数URL是必须要传送的,在这个例子里面我们传送了百度的URL,执行urlopen方法之后,返回一个response对象,返回信息便保存在这里面。

response对象有一个read方法,可以返回获取到的网页内容。

#coding:utf8

import urllib2

request = urllib2.Request('http://www.baidu.com')
response = urllib2.urlopen(request)
html = response.read()
print(html)        

运行结果是完全一样的,只不过中间多了一个request对象,推荐大家这么写,因为在构建请求时还需要加入好多内容,通过构建一个request,服务器响应请求得到应答,这样显得逻辑上清晰明确。

POST和GET数据传送
post方式

#coding:utf8

import urllib
import urllib2

values = {'username':'XXXX', 'password':'XXXXX'}

# values = {}
# values['username'] = ''
# values['password'] = ''

data = urllib.urlencode(values)
url = 'https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn'
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
html = response.read()
print(html)

模拟登陆CSDN,当然上述代码可能登陆不进去,因为还要做一些设置头部header的工作,或者还有一些参数 没有设置全,还没有提及到在此就不写上去了,在此只是说明登录的原理。我们需要定义一个字典,名字为values,参数我设置了username和 password,下面利用urllib的urlencode方法将字典编码,命名为data,构建request时传入两个参数,url和data,运 行程序,即可实现登陆,返回的便是登陆后呈现的页面内容。当然你可以自己搭建一个服务器来测试一下。

GET方式

#coding:utf8

import urllib
import urllib2

values={}
values['username'] = "XXXXX@163.com"
values['password']="XXXXX"
data = urllib.urlencode(values)
url = 'http://passport.csdn.net/account/login'
geturl = url + '?' + data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
html = response.read()
print(html)

设置headers
agent就是请求的身份,如果没有写入请求身份,那么服务器不一定会响应,所以可以在headers中设置agent

#coding:utf8

import urllib
import urllib2

url = 'https://zhihu-web-analytics.zhihu.com'
user_agent = 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0'
values = {'username':'XXXXX', 'password':'XXXXX'}
headers = {'User-Agent':user_agent, 'Referer':'https://www.zhihu.com/'}

data = urllib.urlencode(values)
# geturl = url + '?' + data 
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
html = response.read()
print(html)

我们设置了一个headers,在构建request时传入,在请求时,就加入了headers传送,服务器若识别了是浏览器发来的请求,就会得到响应。
另外,我们还有对付”反盗链”的方式,对付防盗链,服务器会识别headers中的referer是不是它自己,如果不是,有的服务器不会响应,所以我们还可以在headers中加入referer

Proxy 代理设置
urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy。假如一个网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止你的访问。所以你可以设置一些代理服务器来帮助你做工作,每隔一段时间换一个代理,网站君都不知道是谁在捣鬼了,这酸爽!

import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http" : 'http://some-proxy.com:8080'})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
    opener = urllib2.build_opener(proxy_handler)
else:
    opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)

timeout设置
urlopen第三个参数就是timeout的设置,可以设置等待多久超时,为了解决一些网站实在响应过慢而造成的影响。

import urllib2
response = urllib2.urlopen('http://www.baidu.com', timeout=10)

import urllib2
response = urllib2.urlopen('http://www.baidu.com',data, 10)

如果第二个参数data为空那么要特别指定是timeout是多少,写明形参,如果data已经传入,则不必声明。

使用 HTTP 的 PUT 和 DELETE 方法
http协议有六种请求方法,get,head,put,delete,post,options,我们有时候需要用到PUT方式或者DELETE方式请求。
PUT:这个方法比较少见。HTML表单也不支持这个。本质上来讲, PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。
DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如amazon的S3云服务里面就用的这个方法来删除资源。

import urllib2
request = urllib2.Request(uri, data=data)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)

使用DebugLog
可以通过下面的方法把 Debug Log 打开,这样收发包的内容就会在屏幕上打印出来,方便调试

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.baidu.com')

URLError
1)网络无连接,即本机无法上网
2)连接不到特定的服务器
3)服务器不存在

import urllib2

requset = urllib2.Request('http://www.xxxxx.com')
try:
    urllib2.urlopen(requset)
except urllib2.URLError, e:
    print e.reason

利用了 urlopen方法访问了一个不存在的网址,运行结果如下:
socket.error: [Errno 104] Connection reset by peer

HTTPError
HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。举个例子,假如response是一个”重定向”,需定位到别的地址获取文档,urllib2将对此进行处理。

    100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
    101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
    102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
    200:请求成功 处理方式:获得响应的内容,进行处理
    201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
    202:请求被接受,但处理尚未完成 处理方式:阻塞等待
    204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
    300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
    301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
    302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
    304:请求的资源未更新 处理方式:丢弃
    400:非法请求 处理方式:丢弃
    401:未授权 处理方式:丢弃
    403:禁止 处理方式:丢弃
    404:没有找到 处理方式:丢弃
    500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
    501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
    502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
    503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
import urllib2

req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.code
    print e.reason

 <urlopen error [Errno -5] No address associated with hostname>
import urllib2

req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.code
except urllib2.URLError, e:
    print e.reason
else:
    print "OK"

如果捕获到了HTTPError,则输出code,不会再处理URLError异常。如果发生的不是HTTPError,则会去捕获URLError异常,输出错误原因。

加入 hasattr属性提前对属性进行判断

import urllib2

req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.URLError, e:
    if hasattr(e,"code"):
        print e.code
    if hasattr(e,"reason"):
        print e.reason
else:
    print "OK"

cookie
1)Cookie
指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)
1.Opener
当你获取一个URL你使用一个opener(一个urllib2.OpenerDirector的实例)。在前面,我们都是使用的默认的opener,也就是urlopen。它是一个特殊的opener,可以理解成opener的一个特殊实例,传入的参数仅仅是url,data,timeout。
如果我们需要用到Cookie,只用这个opener是不能达到目的的,所以我们需要创建更一般的opener来实现对Cookie的设置。
2.Cookielib
cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源。 Cookielib模块非常强大,我们可以利用本模块的CookieJar类的对象来捕获cookie并在后续连接请求时重新发送,比如可以实现模拟登录 功能。

#coding:utf8

import urllib2
import cookielib

# 声明一个CookieJar对象实例来保存cookie
cookie = cookielib.CookieJar()
# 利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
# 通过handler来构建opener
opener = urllib2.build_opener(handler)
# 此处的open方法同urllib2的urlopen方法,也可以传入request
response = opener.open('http://www.baidu.com')
for item in cookie:
        print('Name =' + item.name)
        print('Value = ' + item.value)

运行结果如下:
Name =BAIDUID
Value = F46FBFA36CE991C71F34015D30C380DA:FG=1
Name =BIDUPSID
Value = F46FBFA36CE991C71F34015D30C380DA
Name =H_PS_PSSID
Value = 1439_19035_21087_18560_22157
Name =PSTM
Value = 1504919759
Name =BDSVRTM
Value = 0
Name =BD_HOME
Value = 0

2)保存Cookie到文件

#coding:utf8

import cookielib
import urllib2

# 设置保存cookie文件,同级目录下的cookie.txt
filename = 'cookie.txt'
# 声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
# 利用urllib2库的HTTPCookieProcessor对象来创建cookie处理器
handler = urllib2.HTTPCookieProcessor(cookie)
# 通过handler来构建opener
opener = urllib2.build_opener(handler)
# 创建一个请求,原理同urllib2的urlopen
url = 'http://www.baidu.com'
#values = {'username':'XXXXX', 'password':'XXXXX'}
#data = urllib2.urlencode(values)
response = opener.open(url)
# 保存cookie到文件
cookie.save(ignore_discard = True, ignore_expires = True)

ignore_discard的意思是即使cookies将被丢弃也将它保存下来,ignore_expires的意思是如果在该文件中 cookies已经存在,则覆盖原文件写入,在这里,我们将这两个全部设置为True。
3)从文件中获取Cookie并访问

#coding:utf8

import cookielib
import urllib2

# 创建MozillaCookieJar实例对象
cookie = cookielib.MozillaCookieJar()
# 从文件中读取cookie内容到变量
cookie.load('cookie.txt', ignore_discard = True, ignore_expires = True)
# 创建请求的request
request = urllib2.Request('http://www.baidu.com')
# 利用urllib2的build_opener方法创建一个opener
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
response = opener.open(request)
print(response.read())

4)利用cookie模拟网站登录

#coding:utf8

import urllib
import urllib2
import cookielib

# 设置保存cookie的文件,同级目录下的cookie.txt
filename = 'cookie.txt'
# 声明一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
handler = urllib2.HTTPCookieProcessor(cookie)
opener = urllib2.build_opener(handler)
values = {'username':'XXXXX', 'password':'XXXXX'}
postdata = urllib.urlencode(values)
# 登录知呼
loginUrl = 'https://zhihu-web-analytics.zhihu.com/api/v1/logs/batch'
# https://www.zhihu.com/#signin
# 模拟登录,并把cookie保存到变量
result = opener.open(loginUrl, postdata)
# 保存cookie到cookie.txt中
cookie.save(ignore_discard = True, ignore_expires = True)
# 利用cookie请求访问另一个网址
otherUrl = 'https://www.zhihu.com/question/65089674/answer/227394610'
result = opener.open(otherUrl)
print(result.read())

参考备注:
http://blog.csdn.net/c406495762/article/details/58716886
https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013976177048818eb4187c05a84f9280169d58e22afa09000
http://blog.csdn.net/vXueYing/article/details/52330180
http://blog.csdn.net/hunauchenym/article/details/6933038

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值