- 实例1:直接爬取网页
- 实例2 : 构造headers,突破访问限制,模拟浏览器爬取网页
- 实例3 : 分析请求参数,构造请求参数爬取所需网页
- 实例4: 爬取图片
- 实例5: 分析请求参数,构造请求参数爬取所需信息
实例1:京东商品页面的爬取
image.png现在我们利用requests库爬取这个页面的商品信息
首先引入requests库
import requests
然后爬取页面
r
然后我们测试状态码,编码和内容
r.status_code
r.encoding
r.text[:1000]
image.png
到此,说明我们已经成功利用requests库获取到了商品页面的信息。
完整的爬取代码
import requests
url =
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
实例2 : 亚马逊商品页面爬取
我们选取如下界面进行爬取
image.png首先,我们按照之前的步骤进行爬取
引入requests库,然后get,判断status_code
r =
r.status_code
显示503,说明服务器错误,
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
我们查看编码发现
r.encoding
'ISO-8859-1'
我们需要转换编码
r.encoding = r.apparent_encoding
然后显示爬取内容,发现
image.png发现出现了错误。
网页告诉我们出现了错误,但只要我们正确获取到了网页的内容,就说明网路方面肯定是没有错误的。这说明亚马逊对爬虫有限制,一般对爬虫限制的话,就是robots协议,其中还可以对访问对象进行限制,限制只能通过相应的浏览器访问,而限制爬虫的访问。
我们通过request.header查看我们发给亚马逊的请求头部到底是什么内容
image.png我们看到信息中的user-agent的信息是python。这说明我们的程序诚实的告诉亚马逊,这个程序是python的requests库发起的请求。
亚马逊的服务器看到这是个爬虫请求,所以就返回错误的信息。
那么我们如何才能访问呢?
我们都知道requests库可以更改请求的头部信息,我们可以模拟一个浏览器的请求
我们构造一个键值对
kv = {'user-agent':'Mozilla/5.0'}
url =
r = requests.get(url, headers = kv)
我们查看状态码,发现为200,说明这一次成功获取到了页面的内容
image.png完整的爬取代码
import requests
url =
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:2000])
except:
print("爬取失败")
实例3: 百度/360搜索关键词提交爬虫
搜索关键词提交的接口:
通过requests的params参数,构造查询参数
完整的代码
import requests
keyword = "刘德华"
url =
try:
kv = {"wd":keyword}
r = requests.get(url, params = kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
print(r.text)
except:
print("爬取失败")
实例4 网络图片的爬取和存储
网络中图片连接的格式
假设我们现在要爬取
图片连接:
完整的爬取代码:
import requests
import os
url =
root = "D://pics//"
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地址归属地查询
我们分析它请求的过程,发现它的请求接口就是在地址后附加参数,类似于百度搜索
所以我们可以构造查询参数,发送给服务器,然后获取返回的结果
完整代码
import requests
url =
ip = "125.220.159.160"
kv = {"ip":ip}
try:
r = requests.get(url, params = kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text)
except:
print("爬取失败")