四小时学python爬虫爬取信息系列(第一天)(全是干货)

四小时学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:[email protected]: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: /*?*
Disallow: /link/

Sitemap: http://www.csdn.net/article/sitemap.txt

#解读:*:所有 /:更目录 Disallow:不允许爬取的

7.知道了Robots协议,我们开始爬

1)先爬一下京东里其中一个小米10的手机

import requests
url="https://item.jd.com/12843872.html"
try:
	r=requests.get(url)
	r.raise_for_status()
	r.encoding=r.apparent_encoding
	print(r.text[:1000])
except:
	print("爬取失败")

然后京东的服务器返回如下,其中第一个网址,我点开发现是登陆界面,可能京东不让这种小爬虫爬,要登录,我换一个网站。

<script>window.location.href='https://passport.jd.com/uc/login?ReturnUrl=http://item.jd.com/12843872.html'</script>

2)爬亚马逊(用cmd然后python再爬)

>>> import requests
>>> r=requests.get("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.status_code  #return 503

>>> r.encoding     #return 'ISO-8859-1'
r>>> .encoding=r.apparent_encoding
>>> r.text #会出现一堆英文,大致意思就是亚马逊提示你访问遇到错误
>>> r.request.headers  #输出头部,会发现被识别了,我是python爬虫
{'User-Agent': 'python-requests/2.23.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', '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&timestamp=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&timestamp=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("爬取失败")

收工,第二天继续更新,,,,有用的话请您点个赞吧。

猜你喜欢

转载自blog.csdn.net/visual_eagle/article/details/106387233