[Python3爬虫]requests库基本使用

1.request是什么

Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。 ——requests中文文档

这个解释也是够调皮的,可以理解为一个发起网络请求的python库

2.requests安装

pip3 install requests

3.httpbin:测试 HTTP 请求及响应的网站

http://httpbin.org 这个网站能测试 HTTP 请求和响应的各种信息,比如 cookie、ip、headers 和登录验证等,且支持 GET、POST 等多种方法,对 web 开发和测试很有帮助。它用 Python + Flask 编写,是github上的一个开源项目。

当访问网址并声明请求方式时:http://httpbin.org/get 返回值如下

{"args":{},
"headers":
{
"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh,en-US;q=0.9,en;q=0.8","Connection":"close",
"Cookie":"_gauges_unique_hour=1; _gauges_unique_day=1; _gauges_unique_month=1; _gauges_unique_year=1; _gauges_unique=1",
"Host":"httpbin.org","Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36"},"origin":"112.117.10.72","url":"http://httpbin.org/get"
}

包含Cookie和User-Agent信息

4.requests基本用法

requests对象基本属性
import requests

r=requests.get('https://www.baidu.com/')
print(r.status_code) #状态码
print(r.text) #网站内容
print(r.cookies) #本地cookies信息
get方法
import requests

r = requests.get('http://httpbin.org/get?name=yhchdev&pasword=888')
data = {
'name':'yhchdev',
'password':'888'
}
r = requests.get("http://httpbin.org/get",params=data)
print(r.status_code) #状态码
print(r.text) #网站内容
print(r.cookies) #本地cookies信息

这里使用了上面介绍的httpbin作为测试网站,返回如下结果

200
{"args":
{"name":"yhchdev","password":"888"},
"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close",
"Host":"httpbin.org","User-Agent":"python-requests/2.9.1"},"origin":"112.117.10.72",
"url":"http://httpbin.org/get?name=yhchdev&password=888"}

<RequestsCookieJar[]>

通过'params='参数传递了之前构造好的jason数据,

伪造请求头

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

而看上面的结果,"User-Agent":"python-requests/2.9.1",这等于告诉对方服务器,我是一个python程序发起的requests请求,等于告诉了对方服务器你是一个爬虫,由于爬虫会消耗一定的服务器资源,所以需要伪造一个请求头,否则有的网站会拒绝爬虫的访问

import requests

#r=requests.get('https://www.baidu.com/')
headers = {
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36'
}
r = requests.get('http://httpbin.org/get?name=yhchdev&pasword=888')
data = {
    'name':'yhchdev',
    'password':'888'
}
r = requests.get("http://httpbin.org/get",params=data,headers=headers)
print(r.status_code) #状态码
print(r.text) #网站内容
print(r.cookies) #本地cookies信息

返回结果

200
{"args":{"name":"yhchdev","password":"888"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Host":"httpbin.org","User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/66.0.3359.139 Chrome/66.0.3359.139 Safari/537.36"},"origin":"112.117.10.72",
"url":"http://httpbin.org/get?password=888&name=yhchdev"}

<RequestsCookieJar[]>
这样让对方误以为这是一个正常的请求,这个请求头不是编写的,是我从chrome浏览器,开发者工具那里复制过来的,url被自动构造成了传统的?传参了

post请求

post请求是向服务器发送一些数据,当然get也能就像上面的程序一样,但get仅限于发送少量信息,并且get传递的参数是通过URL传参的

这个程序是我之前为别人投票发现,没有登录验证,做的一个通过post表单提交的方式,刷票

#-- coding:utf-8 --

import requests

formdata = {"cvs":{"i":200223539,"t":"oh2piVp","s":200637556,"acc":"dxjjW5uC7FyLWtyrSLyYGaes9Rw9ilWu","r":"","c":{"cp":{"202381408":[201932143]}}}}


headers={'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36'}


URL= "http://cn.mikecrm.com/handler/web/form_runtime/handleSubmit.php"


for i in range(1,50):
    response=requests.post(URL,data=formdata,headers=headers)
    print (response.url)
    html = response.text
    print (html)
    print ("第 %d 个post请求提交成功"%(i))

formdata是通过chrome开发者工具抓包分析得来的,提交我所勾选的选项后提交给服务器的数据,URL为投票的网址,同时也伪造了请求头,最后有没有投上去我是不知到哈哈,因为这个网站是通过cookies来判断用户有没有投票的,但是我这里是没有cookies的,因为伪造cookies在这里是没有意义的,因为一旦有了cookie便只能投一次票了

二进制文件的爬取
  • 图片、视频、音频文件的爬取

图片、视频、音频文件本质是二进制文件,要爬取它们获取他们的二进制就可以了,文本是通过text获取,二进制文件通过content来获取

  • python IO操作复习

由于文件读写时都有可能文件不存在产生IOError,导致后面的f.close()就不会调用。所以,为了保证无论是否出错都能正确地关闭文件,使用try ... finally来实现:

try:
    f = open('/path/to/file', 'r')
    print(f.read())
finally:
    if f:
        f.close()

但是每次都这样写太繁琐,所以,Python引入了with语句来自动调用close()方法:

with open('/path/to/file', 'r') as f:
    print(f.read())

这和前面的try ... finally是一样的,但是代码更佳简洁,并且不必调用f.close()方法。

二进制文件通过wb模式来写入文件;通过rb模式来读出二进制文件

爬取一张美女图片@^@

import requests

headers={'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/65.0.3325.181 Chrome/65.0.3325.181 Safari/537.36'}

r=requests.get('http://mm.chinasareview.com/wp-content/uploads/2017a/07/07/01.jpg',headers=headers)
with open('/home/yhch/pytest.jpg','wb') as f:
    f.write(r.content)

如果不伪造请求头的话,爬取下来的图片是打不开的,也就是说服务器并没有返回图片给我

运行效果,看波妹子

picone.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容