[TOC]html
requests库是一个经常使用于http请求的模块,性质是和urllib,urllib2是同样的,做用就是向指定目标网站的后台服务器发起请求,并接收服务器返回的响应内容。python
pip install requests -i https://pypi.douban.com/simple
所谓的get方法,即是利用程序使用HTTP协议中的GET请求方式对目标网站发起请求,一样的还有POST,PUT等请求方式,其中GET是咱们最经常使用的,经过这个方法咱们能够了解到一个请求发起到接收响应的过程。(HTTP常见请求方式:http://www.noob.com/http/http-methods.html) 实现方式:laravel
import requests start_url = 'https://www.baidu.com' response = requests.get(url=start_url) print(response) # 返回值:<Response [200]>
这是一个最简单实现请求的方式,最后返回一个响应对象,响应对象中携带的数值即是HTTP状态码,你能够根据这些状态码的值来断定请求的成功以及推测失败的缘由。(HTTP状态码:http://www.noob.com/http/http-status-codes.html) 这并非一个完整的请求,由于服务器在接收到你的程序的请求信息时,它能够明确的从Request headers中看到你是在用程序发起请求接收响应,为了完善咱们的请求,能够自定义请求头信息,利用get()方法的headers参数。 咱们能够从浏览器的F12开发者工具中Network下找到请求网址的headers信息,保存下来做为咱们自定义参数。如:web
import requests # 目标url start_url = 'https://www.baidu.com' # 自定义headers headers = {"Host": "www.baidu.com", "Referer": "https://www.baidu.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } response = requests.get(url=start_url, headers=headers) print(response) # 返回值:<Response [200]>
不一样的网站对于请求头中的字段信息有着不一样的要求,某些关键字段须要在html源码中去寻找,而后本身组织定义到headers中完成请求。 对于一些特定的网站会对某一时间段内你所在ip的请求次数坐监测,从而判断此请求是否为非人类发出的,get()方法一样为咱们提供了在请求时更换ip的操做方式,只须要像自定义headers同样定义咱们的可用ip便可,以下:ajax
import requests start_url = 'https://www.baidu.com' headers = {"Host": "www.baidu.com", "Referer": "https://www.baidu.com", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } # 自定义代理ip,此处的ip须要自行更换,只须要将ip和port按格式拼接便可,能够去网上免费代理中寻找:http://www.xicidaili.com/nn proxies = {"https": "https://127.0.0.1:1080", "http": "http://127.0.0.1:1080"} response = requests.get(url=start_url, headers=headers, proxies=proxies) print(response) # 返回值:<Response [200]>
除此以外get还有不少请求参数,如timeout你能够设置请求时间,若是超过这个时间变自行结束请求,能够利用此判断请求代理的相应效率,避免在某些错误请求上浪费过多的时间。json
post请求方式的使用和get方式并无很大的区别,本质的区别在于它传递参数的方式并不像get方式同样,经过在url中拼接字段来发送给服务器,他采起了一种相较之下更为安全的操做方式,经过form表单的方式来向服务器传递查询条件。咱们一样能够经过浏览器的F12开发者工具或者fiddler抓包工具来看到formdata这个字段,从中获取form表单中的字段信息,不少登陆操做就是基于此。操做方式以下:api
import requests url = 'https://en.artprecium.com/catalogue/vente_309_more-than-unique-multiples-estampes/resultat' headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Accept-Language": "zh", "Cache-Control": "max-age=0", "Connection": "keep-alive", "Cookie": "PHPSESSID=m2hbrvp548cg6v4ssp0l35kcj7; _ga=GA1.2.2052701472.1532920469; _gid=GA1.2.1351314954.1532920469; __atuvc=3%7C31; __atuvs=5b5e9a0418f6420c001", "Host": "en.artprecium.com", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", } # 构造form表单 data = {"IdEpoque": "", "MotCle": "", "Order": "", "LotParPage": "All", "IdTypologie": ""} response = requests.post(url=url, data=data, headers=headers, timeout=10) print(response) # 返回值:<Response [200]>
上面是一个电商网站的post请求查询的案例,当咱们对页面显示商品数量进行更改时发现咱们的url并无发生改变,此时,咱们即可以分析此动做是由ajax异步加载或者是经过post的请求方式来更改,咱们能够经过开发者工具来获取咱们想要的信息。浏览器
目标网址测试
咱们能够很容易的看到请求头信息和form表单信息,经过修改LotParPage字段信息能够得到不一样数量商品的响应,在实际操做过程当中要经过本身的测试肯定headers中所必需的字段和自定义咱们的form表单从而完成请求,对于post的其余参数和get大体相同,基本通用,有兴趣的话能够去官方查看requests的api文档。安全
post除了构造表单之外还能够像经过像服务器发送json信息的方式获取正确的请求,利用的即是中post(json={"key":"value"})的方式,操做流程大体与post发送form表单类似,案例是一个国外网站的demo,虽然全是一些看不懂的文字,可是无伤大雅,看个流程就好,目标网址:http://anticvarium/auction/archive 从这个页面中咱们能够获得一个专场列表页,每一个专场中有许多商品,当咱们直接去请求每一个专场的URL时不会获得任何结果,咱们能够从开发者工具中找到他的真实接口,以下图所示 咱们在看它像服务器传递的信息:
经过以上的分析,咱们能够服务器
url = 'http://anticvarium/angular' headers = { "Host": "anticvarium", "Connection": "keep-alive", "Content-Length": "14", "Origin": "http://anticvarium", "X-CSRF-TOKEN": "u1InfvhE23slcmReIJlgvI7IGzb3xQEvXHQbP3Bc", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36", "Content-Type": "application/json;charset=UTF-8", "Accept": "application/json, text/plain, */*", "X-Requested-With": "XMLHttpRequest", "Referer": "http://anticvarium/auction/show/66", "Accept-Language": "zh", "Cookie": "_ga=GA1.2.819821684.1533003173; _gid=GA1.2.258681840.1533003173; _ym_uid=1533003182951117996; _ym_d=1533003182; _ym_isad=2; _ym_visorc_35976415=w; tmr_detect=0%7C1533004777867; laravel_session=eyJpdiI6InZNSTlWSlYyUW1BaitUWTNBSjJKckE9PSIsInZhbHVlIjoibWprTDFxeTZZc0lOS2VTcmxIdzZJSkwwTVFXOHphN2FwTysxbXNHSDkybXE0VUZYakpTUlZ5Ykh6U2pFTTVJTWdWUHBUaVJwVGl1Q3RlTjdRQUhKNEE9PSIsIm1hYyI6IjQ5NmIwMGYxNDllZDFiNTY2ZmFjYWY5NjEyOTQ4MTZjYzQzNmFiY2EyMzFiOTY1Mzg3ODUyZTllN2U0MTQwYTEifQ%3D%3D", } response = requests.post(url, headers=headers, json={"auction": 66}) print(response) # 返回值:<Response [200]>