实战1:京东商品页面的爬取
1.寻找目标网页(不一定非用跟笔者一样的)
该网址为https://item.jd.com/12353915.html
2.得到网页地址后可以利用上一篇文章学习到的requests库函数进行页面获取,如图(笔者这里使用了IDLE)
简单解释一下每条代码:
>>> import requests #引入requests库
>>> r = requests.get("https://item.jd.com/12353915.html")
#使用get库函数请求需要的网页
>>> r.status_code #查看请求返回的状态码(200为成功)
200
>>> r.encoding #查看网页编码格式
'gbk'
>>> r.text[:1000]
#从上图中可以看到r.text返回的是字符串类型,由于一般网页的源码较庞大,
#所以这里之查看前1000个字符,结果如上图。
3.将这个小实战整理成代码文件:
import requests
url = "https://item.jd.com/12353915.html"
try: #用于做捕获异常并进行处理。
r = requests.get(url)
r.raise_for_status() #前文讲过,用于测试请求是否出错,若出错则抛出异常
r.encoding = r.apparent_encoding #讲编码方式设为根据网页内容所推断出的编码方式
print(r.text[:1000])
except:
print("爬取失败")
实战2:BOSS直聘职位页面的爬取
1.寻找需要爬取的网页
该网页地址为https://www.zhipin.com/job_detail/a338680773aa98491HRy3tS9E1Y~.html
2.得到网页地址后可以根据前一个小实战进行页面获取,如图(笔者这里使用了IDLE)
3.从上图中可以看到,我们并没有得到我们想要的页面,发生了错误,这是什么原因呢?
我们来看一下我们发起请求的请求头:
从图中,我们可以看到,我们的‘User-Agent’为‘python-requests/2.20.1’,’User-Agent‘字段所表示的意义是浏览器版本,这个字段会被服务器接收到,并根据浏览器版本进行相应的处理。我们的请求如实地告诉了对方服务器,我们是一个爬虫,而对方服务器据此拒绝了我们的请求,所以出现了错误。那我们应该怎么办?
根据上一篇博客讲到的,get函数可以传入一定的自定义参数来发起请求。我们可以手动修改‘User-Agent’字段,来达到隐藏自己的目的。
这样,我们就成功获取到了我们想要的页面。
3.整理一下代码:
import requests
url = "https://www.zhipin.com/job_detail/a338680773aa98491HRy3tS9E1Y~.html"
try: #用于做捕获异常并进行处理。
kv = {'User-Agent':'Mozilla/5.0'} #设置'User-Agent'字段
r = requests.get(url,header=kv)
r.raise_for_status() #前文讲过,用于测试请求是否出错,若出错则抛出异常
r.encoding = r.apparent_encoding #讲编码方式设为根据网页内容所推断出的编码方式
print(r.text[:1000])
except:
print("爬取失败")
实战3:百度/360等搜索引擎关键词提交
1.如果我们希望爬取某些搜索引擎的搜索结果该怎么办?
我们先观察一下使用搜索引擎搜索后的网页。
网页地址为:https://www.baidu.com/s?wd=python
可以看到我们搜索的关键词也在网页中,并且作为wd参数的值。
由此可以推测,我们搜索的关键字被作为请求中的某个参数,服务器根据该参数返回搜索结果。
小结一下:
2.根据上述知识,进行搜索的爬取
简单解释一下代码:
>>> import requests
>>> kv = {'wd':'python'} #自定义'wd'字段的参数
>>> r = requests.get("http://www.baidu.com/s", params=kv) #设置请求的参数列表
>>> r.status_code
200
>>> r.request.url #查看爬取的网页url
'http://www.baidu.com/s?wd=python'
>>> len(r.text)
452794
tip:在发起请求时,也可以尝试用字符串拼接的方式来将参数提交给服务器,可以自己尝试一下。
3.整理一下代码:
import requests
url = "https://www.baidu.com/s"
keyword = "python"
try: #用于做捕获异常并进行处理。
kv = {'wd':keyword}
r = requests.get(url,params=kv)
print(r.request.url)
r.raise_for_status() #前文讲过,用于测试请求是否出错,若出错则抛出异常
print(len(r.text))
except:
print("爬取失败")
4.可以根据这个小实战,自己尝试写一下360,搜狗等搜索引擎的搜索页面获取。
实战4:网络图片爬取和存储
1.预备知识与材料
我们从中选取一个页面,比如
http://www.ngchina.com.cn/photography/photo_of_the_day/5955.html
并得到图片地址(在需要的图片上右键,左键点击复制图片地址)
http://image.ngchina.com.cn/2019/0707/20190707123014213.jpg
2.编写程序,爬取该图片
简单解释下代码:
>>> import requests
>>> path = "D://get_img/img1.jpg" #保存图片的路径
>>> url = "http://image.ngchina.com.cn/2019/0707/20190707123014213.jpg"
>>> r = requests.get(url) #发起请求
>>> r.status_code
200
>>> with open(path, 'wb') as f: #以二进制写打开该文件
f.write(r.content) #将爬取到页面以二进制形式写入该文件
#r.content的用法可以参考上一篇博客,它用于返回爬取页面的二进制形式
645364
>>> f.close() #关闭文件
去磁盘的相应位置查看一下结果:
3.整理一下该代码:
#该代码对上面的操作进行了一定优化,
#一是可以将图片保存成它自己本来的名字,
#二是加入了异常处理和判断,使代码更稳定
import requests
import os
url = "http://image.ngchina.com.cn/2019/0707/20190707123014213.jpg"
root = "D://get_img//" #保存文件的目录
path = root + url.split('/')[-1] #将图片名与路径拼接
#↑这里是使用split将url字符串以'/'拆分成字符串列表,并返回最后一个
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("爬取失败")