python网络请求

python2 Python2x中包含了两个网络模块,分别是urllib与urllib2,urllib2是urllib的升级版,拥有更强大的功能。urllib2可以接受一个Request类的实例来设置URL请求的headers,urllib仅可以接受URL。urllib提供urlencode方法用来GET查询字符串的产生,而urllib2没有。这是为何urllib常和urllib2一起...
摘要由CSDN通过智能技术生成
  • python2

Python2x中包含了两个网络模块,分别是urlliburllib2,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')

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值