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)
|
Cookie(键值对)
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