Contents
  1. 1. urllib2
  2. 2. 正则匹配替换
  3. 3. 处理ssl认证
  4. 4. Handler处理器
  5. 5. gzip压缩
  6. 6. 免费代理
  7. 7. 私密代理(代理授权认证)
  8. 8. Web客户端授权验证
  9. 9. Cookie(键值对)
  10. 10. URLError+HTTPError
  11. 11. HTTP响应状态:
  12. 12. Requests
    1. 12.1. get请求
    2. 12.2. post请求
  13. 13. XPath
  14. 14. 进程&&线程
  15. 15. 内存空间
  16. 16. 互斥锁
  17. 17. 多线程

urllib2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
urllib2.Request(url, headers) # Request(请求)封装一个请求对象
urllib2.urlopen() # 通过urlopen发送这个request对象
urllib2.urlopen(request, timeout = 10) # 发送请求request对象可以添加超时响应
add_header # 添加header头信息
get_header # 得到header头信息
decode("gbk").encode("utf-8") # 把gb2312解码成unicode,并把解码后的unicode按utf-8编码
# 全局解码成utf-8
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
urllib.urlencode(xxx) # 把xxx转码成url编码
urllib.unquote(xxxxxx) # 把url编码xxxxxx转换成原字符串

正则匹配替换

1
2
^(.*):(.*)$
"\1" : "\2",
1
2
3
a = "hello world"
a.split() # 字符串转换为列表
" ".join(a) # 列表转换为字符串

URL –> 统一资源定位符

HTML –> 超文本标记语言

urlopen返回类文件对象(像文件一样),支持文件对象的操作方法

url地址作为Request实例的参数

调用Request.add_header()添加/修改一个特定的header

将字典键值对按URL编码转换

1
2
word = {"wd" : "天堂"}
urllib.urlencode(word)

多个User-Agent

1
2
3
4
5
xx = [
"Mozxxxxxxx",
"Mozxxxxxxx",
"Mozxxxxxxx",
]

随机选择random.choice

处理ssl认证

1
2
3
4
import ssl
context = ssl._create_unverified_context()
在urlopen()方法里,指明添加context参数
如:response = urllib2.urlopen(request, context = context)

Handler处理器

1
2
3
4
5
6
7
8
创建特定功能的opener对象,调用open()方法发送请求
install_opener() --> 全局opener对象(可以被urlopen使用)
#构建一个HTTPHandler 处理器对象,支持处理HTTP请求
http_handler = urllib2.HTTPHandler()
#调用方法,创建支持处理HTTP请求的opener对象
opener = urllib2.build_opener(http_handler)
#将 Debug Log 打开,程序在执行的时候,会把收包和发包的报头在屏幕上自动打印
#http_handler = urllib2.HTTPHandler(debuglevel=1)

gzip压缩

一堆乱码格式

1
2
3
4
5
#格式化
import gzip
gzip.GzipFile(fileobj = data)
StringIO(response.read())通过StringIO获取压缩字节流数据,并存到内存

免费代理

1
2
构建ProxyHandler代理
xxx = urllib2.ProxyHandler({"http" : "ip:端口"})

多个代理

1
2
3
4
5
6
xx = [
{"http" : "ip:端口"},
{"http" : "ip:端口"},
{"http" : "ip:端口"},
{"http" : "ip:端口"}
]

私密代理(代理授权认证)

1
2
3
4
#构建一个附带Auth验证的的ProxyHandler处理器类对象
proxyauth_handler = urllib2.ProxyHandler({"http" : "用户名:密码@ip:端口"})
#通过 build_opener()方法使用这个代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler
opener = urllib2.build_opener(proxyauth_handler)

保护付费ip不会被泄露,可以写入到系统变量里面
系统环境变量位置:/etc/profile
用户环境变量位置:~/.bashrc

1
2
3
export proxy_user="用户名"
export proxy_passwd="密码"
export proxy_server="IP:端口"

Web客户端授权验证

1
2
3
4
5
6
7
8
#构建一个密码管理对象,用来保存需要处理的用户名和密码
passwdmgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
#添加账户信息,第一个参数realm是与远程服务器相关的域信息None,后面三个参数分别是 Web服务器、用户名、密码
passwdmgr.add_password(None, webserver, user, passwd)
#构建一个HTTP基础用户名/密码验证的HTTPBasicAuthHandler处理器对象,参数是创建的密码管理对象
httpauth_handler = urllib2.HTTPBasicAuthHandler(passwdmgr)
#通过 build_opener()方法使用这些代理Handler对象,创建自定义opener对象,参数包括构建的 proxy_handler
opener = urllib2.build_opener(httpauth_handler)
1
2
3
4
5
6
7
import cookielib
#构建一个CookieJar对象实例来保存cookie
cookiejar = cookielib.CookieJar()
#使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler=urllib2.HTTPCookieProcessor(cookiejar)
#通过 build_opener()来构建opener
opener = urllib2.build_opener(handler)
1
2
3
4
5
6
7
import cookielib
#创建MozillaCookieJar实例对象(可以用load)
cookiejar = cookielib.MozillaCookieJar()
#从文件中读取cookie内容到变量
cookiejar.load('cookie.txt')
#使用HTTPCookieProcessor()来创建cookie处理器对象,参数为CookieJar()对象
handler = urllib2.HTTPCookieProcessor(cookiejar)

URLError+HTTPError

1
2
3
4
5
6
7
8
try:
urllib2.urlopen(request)
except urllib2.HTTPError, err:
print err.code
except urllib2.URLError, err:
print err

HTTP响应状态:

1
2
3
4
2xx:成功
3xx:重定向(301)
4xx:客户端错误
5xx:服务器错误

Requests

get请求

response = requests.get("网址")

post请求

1
2
3
4
5
6
formdata = [
"xxx":"xxx",
"xxx":xxx"
]
headers={"User-Agent": "Moz..."}
response = requests.post(url, data = formdata, headers = headers)

re.I --> 表示匹配忽略大小写

match
group

groups --> 返回一个元组()

1
2
ipython中
%hist -f 文件名.py

XPath

html.XPath返回的是列表,如果没有数据返回,返回的则是空列表

xpath模糊查询:
//div[contains(@id, "qiushi_tag")]

内连接() –> 交集

进程&&线程

1
2
1.进程:表示一个程序的一次执行。
2.线程:是cpu运算的基本调度单位

进程之间相互独立,一个cpu时间切片只会运行一个进程。

一个进程可以包含多个线程,每个线程表示一次程序的一次任务。

内存空间

同一个进程的内存空间是共享的,所有的线程都可以使用这块内存空间。

一个线程在使用内存空间的时候,其他线程必须处于阻塞状态

互斥锁

表示一个线程在是使用内存空间时,“锁上”内存空间,防止其他线程读取这款内存空间。

多线程

单线程表示一个程序一次执行一个任务,
多线程表示程序一次可以并发执行多个任务。

Python中的多线程:GIL:全局解释器锁

如果某个线程想要执行,必须拿到GIL锁,所以Python的多线程并不是真正的多线程,不能充分利用多核cpu优势,但是用在爬虫上非常合适。

多进程:密集cpu运算(大规模并行运算),multiprocessing和Process,Pool处理并行运算。在进程之间进行大量数据交互的程序,效率不一定会很高,因为进程之间的内存空间不会共享

多线程:用在密集IO处理(网络IO,磁盘IO,数据库IO),Python多线程模块:threading.Thread,multiprocessing.dummy