爬虫是请求网站并提取自己所需要数据的过程。通过我们的程序,可以代替我们向服务器发送请求,然后进行批量的数据下载。
https://www.baidu.com/s?wd=python3%20requests
。而且get请求是用来获取数据,是幂等的。status code
,使用数字代码表示对于状态,200表示成功,301跳转,404找不到网页,502服务器错误等。pip install requests
在学习爬虫之前,我们先来了解http定义的与服务器交互的七个主要方法:
方法 | 解释 |
---|---|
requests.request() | 构造一个请求,支持以下各种方法 |
requests.get() | 获取html的主要方法 |
requests.head() | 获取html头部信息的主要方法 |
requests.post() | 向html网页提交post请求的方法 |
requests.put() | 向html网页提交put请求的方法 |
requests.patch() | 向html提交局部修改的请求 |
requests.delete() | 向html提交删除请求 |
import requests
requests.get("http://www.baidu.com")
requests.post("http://www.jd.com")
requests.put("http://www.jd.com")
requests.delete("http://www.jd.com")
r=requests.get(url,params,**kwargs)
url: 需要爬取的网站地址。
params: 翻译过来就是参数, url中的额外参数,字典或者字节流格式,可选。
**kwargs : 12个控制访问的参数
kv = {‘key1: ’ values’, ‘key2’: ‘values’}
r = requests.request(‘GET’, ‘http:www.python123.io/ws’, params=kw)
kv = {”key1’: ‘value1’}
r = requests.request(‘POST’, ‘http://python123.io/ws‘, json=kv)
hd = {‘user-agent’: ‘Chrome/10’}
r = requests.request(‘POST’, ‘http://python123.io/ws‘, headers=hd)
属性 | 说明 |
---|---|
r.status_code | http请求的返回状态,若为200则表示请求成功。 |
r.text | http响应内容的字符串形式,即返回的页面内容 |
r.encoding | 从http header 中猜测的相应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式(备选编码方式) |
r.content | http响应内容的二进制形式 |
实例一:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/6/13 12:44
# @Author : zhdya
# @File : demon1.py
import requests
paramss = {'key1': "hello", 'key2': "world"}
urll = 'https://www.baidu.com'
result = requests.get(url= urll , params= paramss )
print(result.url)
结果:
https://www.baidu.com/?key1=hello&key2=world
我们也可以直接
requests.get('https://www.baidu.com/?key1=hello&key2=world')
注意requests库有时会产生异常,比如网络连接错误、http错误异常、重定向异常、请求url超时异常等等。所以我们需要判断r.status_codes是否是200,在这里我们怎么样去捕捉异常呢?
这里我们可以利用 r.raise_for_status() 语句去捕捉异常,该语句在方法内部判断r.status_code是否等于200,如果不等于,则抛出异常。
于是在这里我们有一个爬取网页的通用代码框架:
try:
r=requests.get(url,timeout=30) #请求超时时间为30秒
r.raise_for_status() #如果状态不是200,则引发异常
r.encoding=r.apparent_encoding #配置编码
r.text
except:
return "产生异常"
实例二:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/6/13 12:44
# @Author : zhdya
# @File : demon1.py
import requests
urll = "http://www.okay686.cn"
try:
result = requests.get(url=urll, timeout = 3)
result.raise_for_status()
result.apparent_encoding
print(result.text)
except:
print("产生异常")
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/6/13 12:44
# @Author : zhdya
# @File : demon1.py
import requests
paramss = {'key1': "hello" , 'key2':"world"}
result = requests.post("http://httpbin.org/post", data=paramss)
print(result.text)
http://httpbin.org/post是requests提供的官网地址,通过json的方式给大家返回。可以看到我们返回的数据。Post的数据参数是data,都是字典的类型,但是urllib就没法接受字典类型,必须是字符串。
{"args":{},"data":"","files":{},"form":{"key1":"hello","key2":"world"},"headers":{"Accept":"*/*","Accept-Encoding":"gzip, deflate","Connection":"close","Content-Length":"21","Content-Type":"application/x-www-form-urlencoded","Host":"httpbin.org","User-Agent":"python-requests/2.18.4"},"json":null,"origin":"222.92.90.18","url":"http://httpbin.org/post"}
1、京东商品信息的爬取
不需要对头部做任何修改,即可爬网页:
import requests
url='http://item.jd.com/2967929.html'
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000]) #部分信息
except:
print("爬取失败")
2、亚马逊商品信息的爬取
该网页中对爬虫进行的爬取做了限制,因此我们需要伪装自己为浏览器发出的请求。
urll = 'https://www.amazon.cn/gp/product/B01M8L5Z3Y'
try:
params = {'user_agent':'Mozilla/5.0'}
r = requests.get(url=urll, headers = params) #改变自己的headers
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[1000:2000]) ##部分信息
except Exception as e:
print("Faild to get the info...")
raise e
3、百度搜索关键字提交
百度的关键字接口: https://www.baidu.com/s?wd=keyword
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/6/13 13:27
# @Author : zhdya
# @File : demon2.py
import requests
keywords = input("pls input sth you wanna search: ")
try:
paramas = {'wd': keywords}
r = requests.get('https://www.baidu.com/s', params=paramas)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.url)
except Exception as e:
print("Faild to search, the error as follow:")
raise e
输出:
pls input sth you wanna search: python
https://www.baidu.com/s?wd=python
修改为搜索:
keywords = input("pls input sth you wanna search: ")
try:
paramas = {'wd': keywords}
r = requests.get('http://www.baidu.com/s', params=paramas)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text)
except Exception as e:
print("Faild to search, the error as follow:")
raise e
输出了很多主页的源码。。(自己试试吧)
4、网络图片的爬取(可爱的猫咪)
import requests
import os
try:
url = 'https://b-ssl.duitang.com/uploads/item/201508/07/20150807101946_EzSmP.jpeg'
dir = 'D:/pic/'
path = dir + url.split("/")[-1]
if not os.path.exists(dir):
os.mkdir(dir)
if not os.path.exists(path):
r = requests.get(url, timeout = 30)
f = open(path,"wb")
f.write(r.content)
f.close()
print("already download...")
else:
print("Faild to download...")
except Exception as e:
print("Faild to get the info, the error as follow: ")
raise e