四小时学python爬虫爬取信息系列(第一天)(全是干货)
1.安装requests库(可以在电脑python,我是进入anaconda我建的虚拟环境)
anaconda虚拟环境法流程:
conda activate py36 //进入我的py36环境
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple //安装requests库
电脑python流程:直接cmd,输入下面命令,可能会提示你升级pip ,可以升级
#如果需要升级pip输入:python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple //安装requests库
2.验证安装,爬取csdn的主页验证一下(直接在命令行python或者在python idle进行输入)
import requests
r = requests.get("https://www.csdn.net/")
r.status_code #返回状态为200,证明访问成功,返回值非200则失败
#输入:type(r)
#return <class 'requests.models.Response'> #检测返回值类型,
#如果输入:r.headers 则return页面头信息
r.encoding='utf-8'
r.text #抓取成功,显示如下图(我在cmd操作的)
3.r=requests.get(url) 解析:先构造一个请求向服务器资源的Request对象,return一个包含资源的Response对象。
request.get(url,params=None,**kwargs)
#url:网页链接 #params:链接中的额外参数,可选字典或字节流格式 #**kwargs:12个控制访问的参数
返回的Response对象有五种常用属性
r.status_code #HTTP请求的访问状态,只有200是成功
r.text #HTTP响应的内容,就是网页页面
r.encoding #HTTP header中猜测响应内容编码方式
r.apparent_encoding #从内容中分析出的响应内容编码方式,备选的编码方式
r.content #HTTP响应内容的二进制形式
#测试一下
import requests
r=requests.get("https://www.csdn.net/")
r.status_code
r.encoding
r.apparent_encoding #在r.encoding不能正确得到编码时就用r.apparent_encoding
csdn的页面r.encoding return ‘UTF-8’ ,再试一试r.apparent_encoding return ‘utf-8’,
Requests库的异常
requests.ConnectionErroe #网络连接错误
requests.HTTPError #HTTP错误
requests.URLRequired #URL错误
requests.TooManyRedirects #超过最大重定向次数,产生重定义定向异常
requests.ConnectTimeout #连接远程服务器超时
requests.Timeout #请求URL超时产生异常
实例测试,还是爬csdn主页
import requests
def getHTMLText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status() #200则正常,非200返回requsets.HTTPError
r.encoding=r.apparent_encoding
return r.text
except:
return "Error!!!"
if __name__ == "__main__":
url = "http://www.csdn.net/"
print( getHTMLText(url) )
效果截图:
4.Requests库,基于HTTP协议,超文本传输协议“请求与响应”模式的无状态的应用层协议,我个人觉得就像qt中signal和slot一样。HTTP:connect(&my,SIGNAL(request()),&Internrt_server,SLOT(return_Response()));
#URL格式:
http://host[:port][path]
# host:IP地址 #port:端口号,不写默认80 #path:路径
#HTTP协议对资源操作
CET #请求获取URL位置资源
HEAD #获取资源头部信息
POST #请求x向URL位置的资源后附加新的数据
PUT #请求向URL位置存储一个资源,覆盖原URL位置的资源
PATCH #请求局部更新URL位置的资源,即改变该处外部资源的部分内容
DELETE #请求删除URL位置存储资源
#关系图解:
# GET HEAD
# my <———————————— server
# URL
# my ————————————> server
# PUT POST PATCH DELETE
#Requests库常用
requests.request() #构造一个请求
requests.get() #get HTML网页
requests.head() #get HTML网页头信息
requests.post() #向HTML网页提交POST请求
requests.put() #向HTML网页提交PUT请求
requests.patch() #向HTML网页提交局部修改请求
requests.delete() #向HTML网页提交删除请求
5.详解Requests库
1.requests.request(method,url,**kwargs)
#构造一个请求,method对应get,head,post,put等七种,url对应网络链接,**kwargs 13个控制访问参数
method:
r=requests.request('GET',url,**kwargs)
r=requests.request('HEAD',url,**kwargs)
r=requests.request('POST',url,**kwargs)
r=requests.request('PUT',url,**kwargs)
r=requests.request('PATCH',url,**kwargs)
r=requests.request('DELETE',url,**kwargs)
r=requests.request('OPTIONS',url,**kwargs)
**kwargs:
1)params #字典或字节序列,作为参数增加到url中
>>>kv={'key1':'value1','key2':'value2'}
>>>r=requests.request('GET','http://python123.io/ws',params=kv)
>>>print(r.url)
#输出:http://python123.io/ws?key1=value1&key2=value2
2)data:字典、字节序列或文件对象,作为Request的内容
>>>kv={'key1':'value1','key2':'value2'}
>>>r=requests.request('POST','http://python123.io/ws',data=kv)
>>>body='主体内容'
>>>r=requests.request('POST','http://python123.io/ws',data=body)
3)json:JSON格式数据
>>>kv={'key1':'value1'}
>>>r=requests.request('POST','http://python123.io/ws',json=kv)
4)heders:字典,HTTP定制头
>>>h={'user-agent':'Chrome/10'}
>>>r=requests.request('POST','http://python123.io/ws',headers=h)
5)cookies:字典或CookieJar
6)auth:元组,支持HTTP认证功能
7)files:字典类型,传输文件
>>>f={'file':open('data.xls','rb')}
>>>r=requests.request('POST','http://python123.io/ws',files=f)
8)timeout:设定的超时单位,s为单位
>>>r=requests.request('GET','https://www.csdn.net/',timeout=10)
9)proxies:字典类型,设定访问代理服务器,可以增加登录认证,可以隐藏用户原IP,防止对爬虫的逆追踪
>>>pxs={'http':'http://user:pass@10.11.12.1:1234'
'https':'https://10.11.12.1:1234'}
>>>r=requests.request('GET','https://www.csdn.net/',proxies=pxs)
10)allow_redirects:True/False,默认为True,重定向开关
11)stream:True/False,默认为True,获取内容立即下载的开关
12)verify:True/False,默认为True,认证SSL证书的开关
13)cert:保存本地SSL证书路径
2.requests.get(url,params=None,**kwargs)
#url:网页链接
#params:url中的额外参数,字典或字节流格式,可选
#**kwargs:12个控制访问的参数,除了params
3.requests.head(url,**kwargs)
#url:网页链接
#**kwargs:13个控制访问的参数
4.requests.post(url,data=None,json=None,**kwargs)
#url:网页链接
#data:字典、字节序列或文件,Request的内容
#json:JSON格式的数据,Request的内容
#**kwargs:11个控制访问的参数,除了data和json
5.requests.put(url,data=None,**kwargs)
#url:网页链接
#data:字典、字节序列或文件,Request的内容
#**kwargs:12个控制访问的参数,除了data
6.requests.patch(url,data=None,**kwargs)
#url:网页链接
#data:字典、字节序列或文件,Request的内容
#**kwargs:12个控制访问的参数,除了data
7.requests.delete(url,**kwargs)
#url:网页链接
#**kwargs:13个控制访问的参数
6.在爬取信息的同时要遵守网络的Robots协议,例如csdn的Robots协议如下 https://www.csdn.net/robots.txt
User-agent: *
Disallow: /scripts
Disallow: /public
Disallow: /css/
Disallow: /images/
Disallow: /content/
Disallow: /ui/
Disallow: /js/
Disallow: /scripts/
Disallow: /article_preview.html*
Disallow: /tag/
Disallow: *', 'Connection': 'keep-alive'}
第一次访问被亚马逊识别出我是python爬虫,咱们就修改一下访问的头
>>> kv={'user-agent':'Mozilla/5.0'} #模拟浏览器
>>> url="https://www.amazon.cn/dp/B081W297S2/ref=sr_1_1?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&keywords=%E9%9B%A8%E4%BC%9E&qid=1590566477&sr=8-1"
>>> r=requests.get(url,headers=kv)
>>> r.status_code #return 200 访问成功了!
>>> r.request.headers #验证返回
{'user-agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
>>>r.text #爬到了
整理一下
import requests
url="https://www.amazon.cn/dp/B081W297S2/ref=sr_1_1?__mk_zh_CN=%E4%BA%9A%E9%A9%AC%E9%80%8A%E7%BD%91%E7%AB%99&keywords=%E9%9B%A8%E4%BC%9E&qid=1590566477&sr=8-1"
try:
kv = {'user-agent': 'Mozilla/5.0'}
r=requests.get(url,headers=kv)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
3)百度关键词的提交
#百度关键词接口:
http://www.baidu.com/s?wd=keyword
import requests
kv={'wd':'visual_eagle'}
r=requests.get("http://www.baidu.com/s",params=kv)
r.status_code #return 200,访问成功
r.request.url
#return 'https://wappass.baidu.com/static/captcha/tuxing.html? #&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dvisual_eagle&l#ogid=9103391829453353255&signature=939422699e3799bc3e948e343ea5dfa3×tamp=1590568918'
len(r.text) #return 1519,也就是1k多的信息
整理:
import requests
keyword="visual_eagle"
url="http://www.baidu.com/s"
try:
kv = {'wd': keyword}
r=requests.get(url,params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
输出:
https://wappass.baidu.com/static/captcha/tuxing.html?&ak=c27bbc89afca0463650ac9bde68ebe06&backurl=https%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dvisual_eagle&logid=6903876124859043345&signature=43015c36a586cbce79bfa0ed51610283×tamp=1590569408
1519
点开返回的网址会发现,百度的安全验证
转到正面以后会进入如下图所示
4)爬取图片(直接运行会爬到一张狼的图片,存储到root下,存储名字为图片在网站上的原名)
import requests
import os
url="http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root="D://image//test//"
path=root+url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(url)
with open(path,'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
5)查询ip地址归属(‘0,0,0,0’为IP地址,自己可以改一下试一下)
import requests
url="http://m.ip138.com/ip.asp?ip="
try:
r=requests.get(url+'0.0.0.0')
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")
收工,第二天继续更新,,,,有用的话请您点个赞吧。