python网络请求
1. python怎么响应后端发送get,post请求的接口
测试用CGI,名字为test.py,放在apache的cgi-bin目录下:
#!/usr/bin/Python
import cgi
def main():
print "Content-type: text/html
"
form = cgi.FieldStorage()
if form.has_key("ServiceCode") and form["ServiceCode"].value != "":
print "<h1> Hello",form["ServiceCode"].value,"</h1>"
else:
print "<h1> Error! Please enter first name.</h1>"
main()
python发送post和get请求
get请求:
使用get方式时,请求数据直接放在url中。
方法一、
import urllib
import urllib2
url = "http://192.168.81.16/cgi-bin/python_test/test.py?ServiceCode=aaaa"
req = urllib2.Request(url)
print req
res_data = urllib2.urlopen(req)
res = res_data.read()
print res
方法二、
import httplib
url = "http://192.168.81.16/cgi-bin/python_test/test.py?ServiceCode=aaaa"
conn = httplib.HTTPConnection("192.168.81.16")
conn.request(method="GET",url=url)
response = conn.getresponse()
res= response.read()
print res
post请求:
使用post方式时,数据放在data或者body中,不能放在url中,放在url中将被忽略。
方法一、
import urllib
import urllib2
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "http://192.168.81.16/cgi-bin/python_test/test.py"
req = urllib2.Request(url = requrl,data =test_data_urlencode)
print req
res_data = urllib2.urlopen(req)
res = res_data.read()
print res
方法二、
import urllib
import httplib
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "http://192.168.81.16/cgi-bin/python_test/test.py"
headerdata = {"Host":"192.168.81.16"}
conn = httplib.HTTPConnection("192.168.81.16")
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)
response = conn.getresponse()
res= response.read()
print res
对python中json的使用不清楚,所以临时使用了urllib.urlencode(test_data)方法;
模块urllib,urllib2,httplib的区别
httplib实现了http和https的客户端协议,但是在python中,模块urllib和urllib2对httplib进行了更上层的封装。
介绍下例子中用到的函数:
1、HTTPConnection函数
httplib.HTTPConnection(host[,port[,stict[,timeout]]])
这个是构造函数,表示一次与服务器之间的交互,即请求/响应
host 标识服务器主机(服务器IP或域名)
port 默认值是80
strict 模式是False,表示无法解析服务器返回的状态行时,是否抛出BadStatusLine异常
例如:
conn = httplib.HTTPConnection("192.168.81.16",80) 与服务器建立链接。
2、HTTPConnection.request(method,url[,body[,header]])函数
这个是向服务器发送请求
method 请求的方式,一般是post或者get,
例如:
method="POST"或method="Get"
url 请求的资源,请求的资源(页面或者CGI,我们这里是CGI)
例如:
url="http://192.168.81.16/cgi-bin/python_test/test.py" 请求CGI
或者
url="http://192.168.81.16/python_test/test.html" 请求页面
body 需要提交到服务器的数据,可以用json,也可以用上面的格式,json需要调用json模块
headers 请求的http头headerdata = {"Host":"192.168.81.16"}
例如:
test_data = {'ServiceCode':'aaaa','b':'bbbbb'}
test_data_urlencode = urllib.urlencode(test_data)
requrl = "http://192.168.81.16/cgi-bin/python_test/test.py"
headerdata = {"Host":"192.168.81.16"}
conn = httplib.HTTPConnection("192.168.81.16",80)
conn.request(method="POST",url=requrl,body=test_data_urlencode,headers = headerdata)
conn在使用完毕后,应该关闭,conn.close()
3、HTTPConnection.getresponse()函数
这个是获取http响应,返回的对象是HTTPResponse的实例。
4、HTTPResponse介绍:
HTTPResponse的属性如下:
read([amt]) 获取响应消息体,amt表示从响应流中读取指定字节的数据,没有指定时,将全部数据读出;
getheader(name[,default]) 获得响应的header,name是表示头域名,在没有头域名的时候,default用来指定返回值
getheaders() 以列表的形式获得header
例如:
date=response.getheader('date');
print date
resheader=''
resheader=response.getheaders();
print resheader
列形式的响应头部信息:
[('content-length','295'),('accept-ranges','bytes'),('server','Apache'),('last-modified','Sat,31Mar201210:07:02GMT'),('connection','close'),('etag','"e8744-127-4bc871e4fdd80"'),('date','Mon,03Sep201210:01:47GMT'),('content-type','text/html')]
date=response.getheader('date');
print date
取出响应头部的date的值。
******************************************************************************************************************************************************************************************************************************************************
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。
类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源。
在Python中,我们使用urllib2这个组件来抓取网页。
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。
它以urlopen函数的形式提供了一个非常简单的接口。
最简单的urllib2的应用代码只需要四行。
我们新建一个文件urllib2_test01.py来感受一下urllib2的作用:
import urllib2
response = urllib2.urlopen('http://www..com/')
html = response.read()
print html
按下F5可以看到运行的结果:
我们可以打开网络主页,右击,选择查看源代码(火狐OR谷歌浏览器均可),会发现也是完全一样的内容。
也就是说,上面这四行代码将我们访问网络时浏览器收到的代码们全部打印了出来。
这就是一个最简单的urllib2的例子。
除了"http:",URL同样可以使用"ftp:","file:"等等来替代。
HTTP是基于请求和应答机制的:
客户端提出请求,服务端提供应答。
urllib2用一个Request对象来映射你提出的HTTP请求。
在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,
通过调用urlopen并传入Request对象,将返回一个相关请求response对象,
这个应答对象如同一个文件对象,所以你可以在Response中调用.read()。
我们新建一个文件urllib2_test02.py来感受一下:
import urllib2
req = urllib2.Request('http://www..com')
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
可以看到输出的内容和test01是一样的。
urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。
req = urllib2.Request('ftp://example.com/')
在HTTP请求时,允许你做额外的两件事。
1.发送data表单数据
这个内容相信做过Web端的都不会陌生,
有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。
在HTTP中,这个经常使用熟知的POST请求发送。
这个通常在你提交一个HTML表单时由你的浏览器来做。
并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。
一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。
编码工作使用urllib的函数而非urllib2。
我们新建一个文件urllib2_test03.py来感受一下:
import urllib
import urllib2
url = 'http://www.someserver.com/register.cgi'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
data = urllib.urlencode(values) # 编码工作
req = urllib2.Request(url, data) # 发送请求同时传data表单
response = urllib2.urlopen(req) #接受反馈的信息
the_page = response.read() #读取反馈的内容
如果没有传送data参数,urllib2使用GET方式的请求。
GET和POST请求的不同之处是POST请求通常有"副作用",
它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。
Data同样可以通过在Get请求的URL本身上面编码来传送。
import urllib2
import urllib
data = {}
data['name'] = 'WHY'
data['location'] = 'SDU'
data['language'] = 'Python'
url_values = urllib.urlencode(data)
print url_values
name=Somebody+Here&language=Python&location=Northampton
url = 'http://www.example.com/example.cgi'
full_url = url + '?' + url_values
data = urllib2.open(full_url)
这样就实现了Data数据的Get传送。
2.设置Headers到http请求
有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。
默认的urllib2把自己作为“Python-urllib/x.y”(x和y是Python主版本和次版本号,例如Python-urllib/2.7),
这个身份可能会让站点迷惑,或者干脆不工作。
浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。
下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。
(多谢大家的提醒,现在这个Demo已经不可用了,不过原理还是那样的)。
import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
以上就是python利用urllib2通过指定的URL抓取网页内容的全部内容,非常简单吧,希望对大家能有所帮助
2. Python网络编程5-实现DHCP Client
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议),前身是BOOTP协议,是一个局域网的网络协议,使用UDP协议工作,统一使用两个IANA分配的端口:67(服务器端),68(客户端)。主要作用是集中的管理、分配IP地址,使client动态的获得IP地址、Gateway地址、DNS服务器地址等信息。
option字段
DHCP报文中的Options字段可以用来存放普通协议中没有定义的控制信息和参数。如果用户在DHCP服务器端配置了Options字段,DHCP客户端在申请IP地址的时候,会通过服务器端回应的DHCP报文获得Options字段中的配置信息。
获取IP地址过程
实验使用的linux 主机由两个网络接口,其中ens33使用DHCP获取IP地址,ens37使用静态IP地址;因此需要使用ens33来发送数据包。
Change_MAC.py用于MAC地址与Bytes类型相互转换。
DHCP_Discover.py用于发送DHCP Discover报文;其中GET_MAC.py见ARP章节。
DHCP_Request.py用于发送DHCP Request报文。
DHCP_FULL.py用于完成DHCP Client与DHCP Server的报文交互
Wireshark对远程linux主机抓包,结果如下
客户端以广播发送DHCP Discover包,其中报文操作类型为1(请求报文),DHCP客户端的MAC地址设置为00:0c:29:03:a1:08,option53设置报文类型为Discover,option55(请求选项列表)中包含请求的参数。
服务器以单播向客户端回复信息,其中报文操作类型为2(应答报文),分配给客户端的IP为192.168.160.146,option 53设置报文类型为offer,Option 54设置服务器标识为192.168.160.254,其他option为客户端请求列表的应答。
值得注意的是,交互的四个报文中Transaction ID均为0x00000000,表明是同一次DHCP交互报文。
3. python向指定ip发送数据包会造成
提到网络编程,我们就不得不提socket(衡巧氏套接字),打开一个socket需要知道目标ip和端口,再指定协议类型即可,应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。python提供了咐散两个socket模块:
低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作宽态系统Socket接口的全部方法。
4. Python网络请求和解析json数据
Python 的 json 模块提供了两个函数 json.mps() 和 json.loads() 来编码和解码JSON数据。
如果要处理的是文件而不是字符串,可以使用 json.mp() 和 json.load() 来编码和解码JSON数据。例如:
5. 如何通过网络爬虫获取网站数据
这里以python为例,简单介绍一下如何通过python网络爬虫获取网站数据,主要分为静态网页数据的爬埋山差取和动态网页数据的爬取,实验环境win10+python3.6+pycharm5.0,主要内容如下:
静态网页数据
这里的数据都嵌套在网页源码中,所以直接requests网页源码进行解析就行,下面我简单介绍一下,这里以爬取糗事网络上的数据为例:
1.首先,打开原网页,如下,这里假设要爬取的字段包括昵称、内容、好笑数和评论数:
接着查看网页源码,如下,可以看的出来,所有的数据都嵌套在网页中:
2.然后针对以上网页结构,我们就可以直接编写爬虫代码,解析网页并提取出我们需要的数据了,测试代码如下,非常简单,主要用到requests+BeautifulSoup组合,其中requests用于获取网页源码,BeautifulSoup用于解析网页提取数据:
点击运行这个程序,效果如下,已经成功爬取了到我们需要的数据:
动态网页数据
这里的数据都没有在网页源码中(所以直接请求页面是获取不到任何数据的),大部分情况下都是存储在一唯唯个json文件中,只有在网页更新的时候,才会加载数据,下面我简单介绍一下这种方式,这里以爬取人人贷上面的数据为例:
1.首先,打开原网页,如下,这里假设要爬取的数据包括年利率,借款标题,期限,金额和进度:
接着按F12调出开发者工具,依次点击“Network”->“XHR”,F5刷新页面,就可以找打动态加载的json文件,如下,也就是我们需要爬弯皮取的数据:
2.然后就是根据这个json文件编写对应代码解析出我们需要的字段信息,测试代码如下,也非常简单,主要用到requests+json组合,其中requests用于请求json文件,json用于解析json文件提取数据:
点击运行这个程序,效果如下,已经成功爬取到我们需要的数据:
至此,我们就完成了利用python网络爬虫来获取网站数据。总的来说,整个过程非常简单,python内置了许多网络爬虫包和框架(scrapy等),可以快速获取网站数据,非常适合初学者学习和掌握,只要你有一定的爬虫基础,熟悉一下上面的流程和代码,很快就能掌握的,当然,你也可以使用现成的爬虫软件,像八爪鱼、后羿等也都可以,网上也有相关教程和资料,非常丰富,感兴趣的话,可以搜一下,希望以上分享的内容能对你有所帮助吧,也欢迎大家评论、留言进行补充。
6. python爬虫怎样向dwr框架发送post请求
安装网络请求库,比如 requests
引用库,import requests
构造请求并发送,比如 requests.post(内容)
7. 全方面的掌握Requests库的使用【python爬虫入门进阶】(02)
上一篇文章简单的介绍了 爬虫相关的基础知识点,介绍了一个标准爬虫程序的三个步骤 。这篇文章就让我们接着来学习。
本文重点介绍requests库的使用以及爬虫协议。之前也写了一篇 Requests库使用的博客 ,有兴趣的小伙伴可以去看看。
前面介绍了Requests库是用来抓取网页源码,请求接口的利器,整体上是要比urllib库的request更加好用的库。官网上将其称之为唯一一个非转基因的Python HTTP库,人类可以安全享用。
Requests库有7个主要方法。
不过我们平常最常用的方法还是GET方法和POST方法。
get请求方法是爬虫中最常用到的方法,因为爬虫主要就是爬取网页的信息。最基础的使用是
这里需要通过 res.encoding='utf-8' 设置响应结果的编码格式是utf-8。不然可能会出现中文乱码
如果响应结果是二进制数据的话则需要通过 res.content 方法来提取响应结果。
设置编码的方式也可以是 res.content.decode('utf-8') 。
即
有时候get请求也需要传入参数,这里可以直接将参数拼接到URL上或者通过params参数传入一个字典。
运行结果是:
get请求只能传入简单的参数,如果参数比较复杂或者传入的参数比较多的话则GET请求就不再适用了,这时候就需要适用post请求方法了。
Post请求的请求类型有三种:
以表单的方式提交数据是POST请求的默认的请求格式,只需要将参数放在一个字典中进行传入即可。
这里将请求头的数据放在一个名为header的字典中,然后在请求时通过headers参数传入。在请求中设置了内容类型是 application/json ,编码格式是 charset=utf-8
传入的是一个json字符串,通过data参数进行传入。json字符串可以直接写也可以通过 json.mps(dict) 方法将一个字典序列化,就像下面这样。
文件上传与本节爬虫的内容无关,在此就不过多介绍了。有兴趣的小伙伴可以看看 Python中如何编写接口,以及如何请求外部接口 这篇文章。
在网络请求中,我们常常会遇到状态码是3开头的重定向问题,在Requests中是默认开启允许重定向的,即遇到重定向时,会自动继续访问。通过将allow_redirects 属性设置为False不允许重定向。
通过timeout属性可以设置超时时间,单位是秒。get方法和post方法均可设置。
通过status_code属性可以获取接口的响应码。
有时候我们使用了抓包工具,这时候由于抓包证书提供的证书并不是受信任的数字证书颁发机构颁发的,所以证书的验证会失败,所以我们就需要关闭证书验证。在请求的时候把verify参数设置为False就可以关闭证书验证了。
爬虫协议也叫做robots协议,告诉网络蜘蛛哪些页面可以爬取,哪些页面不能爬取
爬虫文件的规范是:
允许所有的机器人
本文详细介绍了Request库的使用
8. Python如何使用https请求
是发送请求吧,要发送请求的话,可以去网上下载request库,自行调用,然后可以去csdn寻找使用方法,python内部是不支持发送网络请求包的哦QwQ。
9. python爬虫需要会什么
python爬虫要学什么?让我们一起了解一下吧!
1、学习计算机网络协议基础,了解一个完整的网络请求过程,大致了解网络庆山协议(http协议,tcp-ip协议),了解socket编程,为后期学习爬虫打下扎实的基础。
2、学习前端基础,你需要掌握html、css和JavaScript之间的关系野差蠢,浏览器的加载过程,ajax、json和xml,GET、POST方法。
3、学习python爬虫相关知识,比如最常使用的爬虫库requests,要知道如何用requests发送请求获取数据。网页定位和选取,比如beautifulsoup、xpath、css选择器,数据处理用正则表达式。
4、学习数据存储知识,比如用python将抓取的数据自动导出Excel或者数据库中。
拓展:爬虫python能做什么
1、收集数据
python爬虫程序可用于收集数据。这也是最直接和最常用的方法。由于爬虫程序是一个程序,程序运行得非常快,不会因为重复的事情而感到疲倦,因此使用爬虫程序获取大量数据变得非常简单和快速。
2、调研
比如要调研一家电商公司,想知道他们的商品销售情况。这家公司声称每月销售额达数亿元。如果你使用颂陪爬虫来抓取公司网站上所有产品的销售情况,那么你就可以计算出公司的实际总销售额。
3、刷流量和秒杀
刷流量是python爬虫的自带的功能。当一个爬虫访问一个网站时,如果爬虫隐藏得很好,网站无法识别访问来自爬虫,那么它将被视为正常访问。
除了刷流量外,还可以参与各种秒杀活动,包括但不限于在各种电商网站上抢商品,优惠券,抢机票和火车票。
今天的分享就是这些,希望能帮助到大家!
10. python3中使用urllib进行https请求
刚入门python学习网络爬虫基础,我使用的python版本是python3.6.4,学习的教程参考 Python爬虫入门教程
python3.6的版本已经没有urllib2这个库了,所以我也不需要纠结urllib和urllib2的区别和应用场景
参考这篇官方文档 HOWTO Fetch Internet Resources Using The urllib Package 。关于http(s)请求一般就get和post两种方式较为常用,所以写了以下两个小demo,url链接随便找的,具体场景具体变化,可参考注释中的基本思路
POST请求:
GET请求:
注意,
使用ssl创建未经验证的上下文,在urlopen中需传入上下文参数
urllib.request.urlopen(full_url, context=context)
这是Python 升级到 2.7.9 之后引入的一个新特性,所以在使用urlopen打开https链接会遇到如下报错:
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)
所以,当使用urllib.urlopen打开一个 https 链接时,需要先验证一次 SSL 证书
context = ssl._create_unverified_context()
或者或者导入ssl时关闭证书验证
ssl._create_default_https_context =ssl._create_unverified_context