学习笔记之——Requests库网络爬虫实战(5个实例)

一、前言

代码的可靠和稳定非常重要,在工程要求上,代码要时刻考虑代码执行过程中可能出现的问题,并对问题做处理,所以从一开始就要有这个意识。

二、实战1——京东商品页面的爬取

这部分属于初级打怪,服务器未设置审查,实现比较简单。

# IDLE下过程
>>> import requests
>>> r = requests.get("https://item.jd.com/2967929.html")
>>> r.status_code
200
>>> r.encoding
'gbk' # 不是ISO-8859-1,说明京东网站的头信息提供了相应的编码方式gbk,不用使用r.apparent_encoding方式去获取。
>>> r.text[:1000]  # 列出返回数据的前1000个字符,防止IDLE因为text数据量过大从而失效,通常是[:1000]或者[-500:]
# 完整的京东商品页面的爬取python源代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests # 导入Requests库

url = "https://item.jd.com/7321794.html"
try:
    r = requests.get(url)
    r.raise_for_status() # 如果状态不是200,引发HTTPError异常
    r.encoding = r.apparent_encoding # 从页面获取编码方法并赋给r.encoding
    print(r.text[:1000]) # 列出返回数据的前1000个字符,防止IDLE因为text数据量过大从而失效,通常是[:1000]或者[-500:]
except:
    print("爬取失败")

三、实战2——亚马逊商品页面的爬取

进一步升级打怪——服务器设置了审查,需要爬虫模拟浏览器,更改request字段中的user-agent字段。

>>> import requests
>>> r = requests.get("https://www.amazon.cn/gp/product/B01M8L5Z3Y")
>>> r.status_code
503 # 返回不是200,说明连接出现问题,由API造成的错误,具体这个503代表的含义需要进一步研究
>>> r.encoding
'ISO-8859-1' # 说明header未提供编码方式,需要用r.apparent_encoding获取,且说明这个503错误不是连接错误,而是审查受限
>>> r.encoding = r.apparent_encoding
>>> r.text # 里面显示抱歉XXX
>>> r.request.headers # 查看请求里面的头信息
{'User-Agent': 'python-requests/2.21.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
# User-Agent字段:真实地告诉了服务器我是一个python-request
>>> kv = {'user-agent':'Mozilla/5.0'} # 构建一个键值对,对应"user-agent"字段
>>> url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
>>> r = requests.get(url,headers = kv) 
>>> r.status_code
200 # 访问成功
>>> r.request.headers
{'user-agent': 'Mozilla/5.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
>>> r.encoding = r.apparent_encoding
>>> r.text[:1000] # 正确显示
# 完整的亚马逊商品页面的爬取python源代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
    kv ={'user-agent':'Mozilla/5.0'} # 定义一个键值对
    r = requests.get(url,headers = kv) # 改变request里面headers的user-agent字段,模拟成浏览器
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[1000:2000]) # 打印获取text的1000-1999的字符
except:
    print("爬取失败")

四、实战3——百度/360搜索关键词提交

继续深入打怪升级,使用params修改url。这个部分涉及了HTTP和HTTPS的差异,稍微在最后补充一点相关性。在这部分有个问题没有解决,百度用https爬取的数据与http爬取差距很大,但是360搜索用https和http爬取数据量基本接近,原因是如何?

# IDLE过程
>>> import requests
>>> kv = {'wd':'Python'}
>>> r = requests.get("http://www.baidu.com/s",params = kv)
>>> r.status_code
200
>>> r.request.url
'http://www.baidu.com/s?wd=Python'
>>> len(r.text)
431299
# 完整的百度搜索关键词提交python源代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
keyword = "Python"
try:
    kv = {'wd':keyword}
    r = requests.get('http://www.baidu.com/s',params = kv) # 在url后面加上wd=Python
    # 这里还有个细节,如果使用"https"爬取,返回数据量小很多只有227
    print(r.request.url) # 打印请求的url信息
    r.raise_for_status() # 如果返回不是200则引发HTTPError错误,但是一定不能写错,如果写成r.raise_for_satus()也会直接引发错误,输出"爬取失败"
    print(len(r.text)) # 打印获取数据的大小
except:
    print("爬取失败")
# 完整的360搜索关键词提交python源代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
keyword = "Python"
try:
    kv = {'q':keyword}
    r = requests.get("http://www.so.com/s",params = kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text)) # 打印网页大小
except:
    print("爬取失败")

五、实战4——网络图片的爬取和存储

这部分继续深入,涉及到保存爬取的数据,以及os模块的使用,文件的打开、写入、关闭等操作。刚好在实战中复习python基础知识。
网络图片链接的格式:
http://seopic.699pic.com/photo/50114/7062.jpg_wh1200.jpg

>>> import requests
>>> path = "D:/abc.jpg"
>>> url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
>>> r = requests.get(url)
>>> r.status_code
200
>>> with open(path,'wb') as f:
 f.write(r.content)


228206
# 完整的网络图片的爬取和存储python源代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
import os # 导入os模块

url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root = "D://pics//"
path = root + url.split('/')[-1] # 以原网页上的名字命名下载的文件
try: # 异常处理
    if not os.path.exists(root): # 判断root路径是否存在,不存在则创建root路径
        os.mkdir(root) # 创建root路径
        print('成功创建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地址归属地的自动查询

打怪升级之——换位思考,把自己当做爬虫,从人机交互的网页从,分析找到正确的URL,从而爬取数据。
告诉我们:网站上的人机交互模式,其实都是以url链接的形式提交,学会挖掘网站后台的API。

# IDLE过程
>>> import requests
>>> url = "http://m.ip138.com/ip.asp?ip="
>>> r = requests.get(url+'202.204.80.112')
>>> r.status_code
200
>>> r.text[-500:]
完整的IP地址归属地的自动查询python源代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import requests
url = "http://m.ip138.com/ip.asp?ip=" # 构造提交IP链接的格式
try:
    r = requests.get(url+"202.204.80.112") 
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[-500:])
except:
    print("爬取失败")

七、HTTP和HTTPS的区别与联系

HTTP是一个基于“请求与响应"模式的、无状态的应用层协议。
HTTPS(安全套接字层超文本传输协议)是在HTTP的基础上加入SSL协议,并为浏览器和服务器之间的通信加密。
HTTP:优点是传输速度快,缺点是明文传输,不安全。
HTTPS:优点是相对安全很多,缺点是加载慢,用户体验比HTTP差,连接缓存慢,占用服务器资源高,流量成本高、SSL证书花钱。
应用场景:HTTP:大流量网站(如视频网站)、个人网站、小网站、安全性要求不那么高的网站。
HTTPs:对于数据安全要求严格,比如信用卡号、密码等支付信息。
其他不同之处:

  1. HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头
  2. HTTP 是不安全的,而 HTTPS 是安全的
  3. HTTP 标准端口是 80 ,而 HTTPS 的标准端口是 443
  4. 在 OSI 网络模型中,HTTP 工作于应用层,而 HTTPS 工作在传输层
  5. HTTP 无需加密,而 HTTPS 对传输的数据进行加密
  6. HTTP 无需证书,而 HTTPS 需要认证证书

八、参考资料

学习的北京理工大学嵩天老师的《Python网络爬虫与信息提取》

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值