-
python2
Python2x中包含了两个网络模块,分别是urllib与urllib2,urllib2是urllib的升级版,拥有更强大的功能。urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。
urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起使用的原因。
- urllib.urlencode(query[, doseq]):将dict或者包含两个元素的元组列表转换成url参数。例如 字典{'name': 'dark-bull', 'age': 200}将被转换为"name=dark-bull&age=200"
目前的大部分http请求都是通过urllib2来访问的
# -*- coding:UTF-8 -*-
import urllib2
import urllib
# 1、抓取网页
response = urllib2.urlopen("http://www.baidu.com/")
print response.read()
'''
分析:
response = urllib2.urlopen("http://www.baidu.com/")
调用urllib2的urlopen方法,传入一个url,这个网址的协议是http,也可以使用ftp,file,https等
urlopen接受三个参数:
urlopen(url, data, timeout)
第一个url就是URL地址,
第二个data是访问URL时要传送的数据,
第三个timeout是设置超时时间。
第二三个参数可以不传送,data默认为空,timeout默认为socket._GLOBAL_DEFAULT_TIMEOUT
第一个参数必须传送。
返回一个response对象,返回信息保存在这里面。
print response.read()
response对象有一个read()方法,可以获取网页内容
'''
# ----------------------------------------------------------------------------------------
# 2、构造request
request = urllib2.Request("http://www.baidu.com/")
response = urllib2.urlopen(request)
print response.read()
'''
分析:
urlopen传入一个request请求,其实就是一个Request类的实例,构造时传入URL,data等内容。
通过构造一个request,服务器响应请求得到应答,逻辑更加清晰
'''
# ----------------------------------------------------------------------------------------
# 3、POST和GET数据传送
# POST
values = {}
values["username"] = "kevinelstri"
values["password"] = "******"
data = urllib.urlencode(values) #这里要用到urllib.urlencode来转换参数
url = "https://passport.csdn.net/account/login?from=http://my.csdn.net/my/mycsdn"
request = urllib2.Request(url, data)
response = urllib2.urlopen(request)
print response.read()
# GET
values = {}
values["username"] = "kevinelstri"
values["password"] = "******"
data = urllib.urlencode(values)
url = "http://passport.csdn.net/account/login"
geturl = url+'?'+data
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print response.read()
'''
分析:
动态网页的抓取以及登录,不能直接进行获取,需要需要进行登陆。
数据传送分为POST和GET
GET方式是直接以链接形式进行访问,链接包含了所有的参数,当然如果包含了密码的话就是一种不安全的选择,
不过可以直观的看到提交的内容。
POST方式不会在网址上显示所有的参数,不过如果想直接查看提交的内容就不太方便了。
'''
# ----------------------------------------------------------------------------------------
# 4、高级用法:设置Headers
url = 'http://www.server.com/login'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {"username":"1098918523@qq.com", "password":"341204baiduhi"}
headers = {'User_Agent': user_agent}
data = urllib.urlencode(values)
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)
print response.read()
# ----------------------------------------------------------------------------------------
# 5、高级用法:proxy的设置
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)
'''
分析:
使用代理服务器进行访问,来防止ip访问次数过多造成访问禁止
'''
# ----------------------------------------------------------------------------------------
# 6、高级用法:Timeout设置
response = urllib2.urlopen('http://www.baidu.com', timeout=10)
print response.read()
'''
分析:
设置Timeout,设置等待多久超时,为解决网站响应慢造成的影响
'''
# ----------------------------------------------------------------------------------------
# 7、高级用法:使用http的put和delete方法
url = "http://www.baidu.com"
request = urllib2.Request(url)
request.get_method = lambda: 'PUT' # or 'DELETE'
response = urllib2.urlopen(request)
print response.read()
'''
分析:
http协议的六种请求:
get,head,put,delete,post,options
put:和post相似,都是向服务器发送数据
一个重要区别就是:put通常指定了资源的存放位置,而post则没有,post的数据存放位置由服务器自己决定
delete:删除某个资源,很少使用
'''
# ----------------------------------------------------------------------------------------
# 8、高级用法:使用debuglog,调试日志
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")
'''
分析:
将收发包的内容打印到屏幕上,方便调试,打印的是调试日志
'''
-
python3x
python3把urllib和urllib2合并成了一个库:urllib.request
#带参数的post请求
import urllib.request
import urllib.parse
data = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
data = data.encode('utf-8')
request = urllib.request.Request("http://requestb.in/xrbl82xr")
# adding charset parameter to the Content-Type header.
request.add_header("Content-Type","application/x-www-form-urlencoded;charset=utf-8")
f = urllib.request.urlopen(request, data)
print(f.read().decode('utf-8'))
#带参数的get请求
import urllib.request
import urllib.parse
params = urllib.parse.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
f = urllib.request.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
print(f.read().decode('utf-8'))
和python2的基本流程还是差不多的,都是通过Request()来构造请求,然后urlopen或者直接urlopen()来获得响应,然后用read()方法读取网页内容(可能需要decode()),
-
第三方库:requests
python2和python3都支持,文档链接http://docs.python-requests.org/zh_CN/latest/user/quickstart.html
import requests
r = requests.get('https://api.github.com/events')
print(r.text)
r = requests.post('http://httpbin.org/post', data = {'key':'value'})
#传递URL参数
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://httpbin.org/get", params=payload)
print(r.url) #输出http://httpbin.org/get?key2=value2&key1=value1
-
IP查询脚本,Python2.7实现
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os
import re #正则表达式库
import ast #词法分析模块
import sys
import urllib2
import requests
reload(sys)
sys.setdefaultencoding('utf-8')
#ip.taobao.com
def getFromIptaobao(inputIP):
try:
url = 'http://ip.taobao.com/service/getIpInfo.php?ip={0}'
urls = url.format(inputIP)
req = urllib2.Request(urls)
rsp = urllib2.urlopen(req).read()
result = ast.literal_eval(rsp)
i = '{0} {1} {2} {3}'.format(result['data']['country'], result['data']['region'],result['data']['city'], result['data']['isp'])
return i
except:
print("IP taobao Failed!")
#ip13.cn
def getFromIp138(inputIP):
try:
url = 'http://www.ip138.com/ips138.asp'
kv = {'ip': inputIP}
r = requests.get(url,params=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
return re.search(u'<li[^>]*>本站数据:([^<]+)</li>', r.text).group(1).strip('\n')
except:
print("IP138 Failed!")
#ipip.net免费接口有限制,
def getFromIpip(inputIP):
hdr = { 'User-Agent' : 'super happy flair bot by /u/spladug' }
url = "http://freeapi.ipip.net/{0}"
urls = url.format(inputIP)
req = urllib2.Request(urls,headers=hdr)
rsp = urllib2.urlopen(req).read()
str = ''
for v in eval(rsp):
str += v+' '
return str.strip('\n')
#太平洋网络
def getFromTaipingyang(inputIP):
url = 'http://whois.pconline.com.cn/?ip={0}'
urls = url.format(inputIP)
req = urllib2.Request(urls)
rsp = urllib2.urlopen(req).read().decode('gbk').encode('utf-8')
return re.search('位置:(.*?\s.*?)\s',rsp,re.S|re.M).group(1).strip('\n')
if __name__ == '__main__':
if len(sys.argv) != 2:
raise Exception("Need argument:ip file name")
ip_file_name=sys.argv[1]
ip_txt=open(ip_file_name,'r')
ip_line = ip_txt.readlines()
for ip in ip_line:
ip=ip.strip('\n')
print(ip)
print('IPtaobao查询结果: '),
print(getFromIptaobao(ip))
print('ip138查询结果: '),
print(getFromIp138(ip))
print('太平洋网络查询结果: '),
print(getFromTaipingyang(ip))
#print('\n')