Requests是python的一个HTTP客户端库,几乎能够解决咱们遇到的任何爬虫问题,其强大简洁的API足以让人体会到python的优雅。html
Windows下安装经过python
pip install requests
以后能够在CMD下运行 pythonjson
https://2.python-requests.org//zh_CN/latest/user/quickstart.html
HTTP请求中咱们一般只会用GET和POST,requests对于区分了两种不一样的请求方式。分别是带参数和不带参数,下边给出实例:服务器
不带参数cookie
https://www.baidu.com
带参数app
https://www.baidu.com/s?wd=python
判断URL是否带有参数,能够经过对符号?的判断。通常网站URL后边带有?说明带有参数,参数的规则以下dom
1)?后接参数ide
2)参数之间用&链接模块化
Requests 实现 GET 请求,对可带参数的 URL 有两种方式:基本使用示例网站
# 解析if __name__ == '__main__': main()# 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');# 在你本身眼中,你是你本身(__name__ == '__main__')。
# if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
优势:
两种方法均可以,实际开发中建议第一种,由于更加简洁优雅,体现了python的语法。
也就是:
方便传输参数
方便维护
方便调试
耦合性低,模块化
import requests
url = 'https://www.baidu.com'
params = {'wd':'python', 'pn': 'C#'}response = requests.get(url, params = params)print(response.url)
# 输出https://www.baidu.com/?wd=python&pn=C%23
须要注意的是,GET请求传递的是params,POST传递的是data,不能混淆两者。
此外,服务器返回的信息里包含了许多咱们须要的数据,好比
Html.status_code | 相应状态码 |
---|---|
Html.raw | 原始响应体 |
Html.content | 字节响应体,须要解码 |
Html.text | 字符串的响应方式 |
Html.headers | 服务器响应头 |
Html.josn() | requests内置的json解码器 |
Html.cookies | 获取请求后的cookies |
Html.encoding | 获取编码格式 |
Post 使用示例二
请求json数据
以前有不少小伙伴问我,如何抓取腾讯新闻,那么我今天要告诉你,它来了:
# -*- coding: utf-8 -*-# @Author :AI悦创# @DateTime :2019/9/14 16:10 # @FileName :newsqq_title.PY# @Function :功能# Development_tool :PyCharm# <-------import data-------------->import requests
url = 'https://news.qq.com/ext2020/apub/json/prevent.new.json'html = requests.get(url)
base_url = 'https://new.qq.com/omn/20190913/'if html.status_code == 200: for title in html.json(): print(title['id'], title['title'],'详情页网址:>', base_url + title['id']) # 详情页的数据就再进一步请求便可 # 输出"C:\Program Files\Python37\python.exe" D:/daima/pycharm_daima/爬虫大师班/newsqq_title.py20190724V0BAZH 河北怀来气体中毒事故续:5人因救人中毒 进现场2分钟就晕倒 详情页网址:> https://new.qq.com/omn/20190913/20190724V0BAZH20190723A0RQDR 广西桂林一景区女浴室内装摄像头,16名女游客报警维权 详情页网址:> https://new.qq.com/omn/20190913/20190723A0RQDR20190724V0WL4T 紧急呼叫丨湖南男子称被警察打伤续 拉架者:无端被打望道歉赔偿 详情页网址:> https://new.qq.com/omn/20190913/20190724V0WL4T20190727A06E37 山西一刑释人员控制“村两委”:带打手到医院砍人,打断村民四肢 详情页网址:> 中间大部分省略。。。。。。https://new.qq.com/omn/20190913/20190727A06E37https://new.qq.com/omn/20190913/20190913V006UZ20190913V049GN “你刚举报我了?”记者举报非法生产 10分钟后神秘人打来电话 详情页网址:> https://new.qq.com/omn/20190913/20190913V049GN20190912A0QQJT 广州一24岁女教师在校内离奇死亡 去世前一天还给家里转帐 详情页网址:> https://new.qq.com/omn/20190913/20190912A0QQJT20190912A0R6DY 华中科技大学研究生跳楼身亡 校方:中止导师研究生招生资格两年 详情页网址:> https://new.qq.com/omn/20190913/20190912A0R6DY20190913V00KE3 深圳一小区高空锯树砸死路过老人:事发时正带着小孩散步 详情页网址:> https://new.qq.com/omn/20190913/20190913V00KE3
进程已结束,退出代码 0
我们今天写个小爬虫,百度图片:
咱们能够发现是以30为基准的,每30 一个
注意,这里爬取的百度图片是 Ajax 因此图片获取和你实际页面看的不同。
上面的也是QQ新闻的,简单爬虫。
那百度图片呢?
由于,我是分开写的。很差都显示出来,您能够经过如下方式获取完整代码
1,公众号后台回复:baidu_img
2,点击我朋友圈里的相关代码连接
2
.构建复杂请求
requests.get():
是单个独立的,服务器认为是两个不一样的人访问的。
这样就会出现许多的样板代码,就相似于每次get都须要加headers
忽略HTTPS证书验证
ip代理
3 上传与下载上传文件
file:文件名称(固定的)
render:起个名字而后打开
application/html:文件格式(html 换成txt等)
Expires:过时时间
文件下载:
4
# Urllib 经常使用 API
1. urllib.parse.urljoin2. urllib.parse.quote3. urllib.parse.urlsplit4. urllib.parse.urlparse
1. urllib.parse.urljoinfrom urllib import parse
domain = 'https://bilbil/com/'url = '/img_1234'res = domain + urlprint('不使用库:>>>', res)res = parse.urljoin(domain, url)print('使用urllib:>>>', res)
# 输出不使用库:>>> https://bilbil/com//img_1234使用urllib:>>> https://bilbil/img_1234[Finished in 0.2s]
2. urllib.parse.quotefrom urllib import parse
text = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%A3%81%E7%BA%B8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%A3%81%E7%BA%B8&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=60&rn=30&gsm=&1568645521643='unquote = parse.unquote(text)print(unquote,'\n\n')
quote = parse.quote(text)print(quote)
# 输出http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=壁纸&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=壁纸&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=60&rn=30&gsm=&1568645521643=
http%3A//image.baidu.com/search/acjson%3Ftn%3Dresultjson_com%26ipn%3Drj%26ct%3D201326592%26is%3D%26fp%3Dresult%26queryWord%3D%25E5%25A3%2581%25E7%25BA%25B8%26cl%3D2%26lm%3D-1%26ie%3Dutf-8%26oe%3Dutf-8%26adpicid%3D%26st%3D-1%26z%3D%26ic%3D0%26hd%3D%26latest%3D%26copyright%3D%26word%3D%25E5%25A3%2581%25E7%25BA%25B8%26s%3D%26se%3D%26tab%3D%26width%3D%26height%3D%26face%3D0%26istype%3D2%26qc%3D%26nc%3D1%26fr%3D%26expermode%3D%26force%3D%26cg%3Dwallpaper%26pn%3D60%26rn%3D30%26gsm%3D%261568645521643%3D[Finished in 0.2s]
3. urllib.parse.urlsplit4. urllib.parse.urlparse
from urllib import parse
url = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result'print(parse.urlsplit(url)) # 分割# print(quote == text)print(parse.urlparse(url)) # 解析(高级一些)
# 输出SplitResult(scheme='http', netloc='image.baidu.com', path='/search/acjson', query='tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result', fragment='')ParseResult(scheme='http', netloc='image.baidu.com', path='/search/acjson', params='', query='tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result', fragment='')[Finished in 0.2s]
拓展:
url='&rsv_sug7=001&rsv_n=2&rsv_sug2=0&prefixsug=https%253A%252F%252Fwww.raspberrypi.org%252Fdownloads%252F&rsp=6&rsv_sug9=es_0_1&inputT=1489&rsv_sug4=1502&rsv_sug=9'
如上url,咱们可能会对百分号后的内容产生疑问而unquote的做用就是翻译它们的,(url内容变咱们所能理解的语言)quote(将咱们的语言转换成相似内容)如下是代码:
from urllib import parseprint(parse.unquote('咱们要翻译的url中%后的内容'))print(parse.quote('咱们要翻译的汉字')