Python网络爬虫与信息提取(实例讲解)


Posted in Python onAugust 29, 2017

课程体系结构:

1、Requests框架:自动爬取HTML页面与自动网络请求提交

2、robots.txt:网络爬虫排除标准

3、BeautifulSoup框架:解析HTML页面

4、Re框架:正则框架,提取页面关键信息

5、Scrapy框架:网络爬虫原理介绍,专业爬虫框架介绍

理念:The Website is the API ...

Python语言常用的IDE工具

文本工具类IDE:

IDLE、Notepad++、Sublime Text、Vim & Emacs、Atom、Komodo Edit

集成工具IDE:

PyCharm、Wing、PyDev & Eclipse、Visual Studio、Anaconda & Spyder、Canopy

·IDLE是Python自带的默认的常用的入门级编写工具,它包含交互式文件式两种方式。适用于较短的程序。

·Sublime Text是专为程序员开发的第三方专用编程工具,可以提高编程体验,具有多种编程风格。

·Wing是Wingware公司提供的收费IDE,调试功能丰富,具有版本控制,版本同步功能,适合于多人共同开发。适用于编写大型程序。

·Visual Studio是微软公司维护的,可以通过配置PTVS编写Python,主要以Windows环境为主,调试功能丰富。

·Eclipse是一款开源的IDE开发工具,可以通过配置PyDev来编写Python,但是配置过程复杂,需要有一定的开发经验。

·PyCharm分为社区版和专业版,社区版免费,具有简单、集成度高的特点,适用于编写较复杂的工程。

适用于科学计算、数据分析的IDE:

·Canopy是由Enthought公司维护的收费工具,支持近500个第三方库,适合科学计算领域应用开发。

·Anaconda是开源免费的,支持近800个第三方库。

Requests库入门

Requests的安装:

Requests库是目前公认的爬取网页最好的Python第三方库,具有简单、简捷的特点。

官方网站:http://www.python-requests.org

在"C:\Windows\System32"中找到"cmd.exe",使用管理员身份运行,在命令行中输入:“pip install requests”运行。

Python网络爬虫与信息提取(实例讲解)

使用IDLE测试Requests库:

>>> import requests
>>> r = requests.get("http://www.baidu.com")#抓取百度页面
>>> r.status_code
>>> r.encoding = 'utf-8'
>>> r.text

Requests库的7个主要方法

方法 说明
requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELET

详细信息参考 Requests库 API文档:http://www.python-requests.org/en/master/api/

get()方法

r = requests.get(url)

get()方法构造一个向服务器请求资源的Request对象,返回一个包含服务器资源的Response对象。

requests.get(url, params=None, **kwargs)

url:拟获取页面的url链接

params:url中的额外参数,字典或字节流格式,可选

**kwargs:12个控制访问参数

Requests库的2个重要对象

· Request

· Response:Response对象包含爬虫返回的内容

Response对象的属性

r.status_code :HTTP请求的返回状态,200表示连接成功,404表示失败

r.text :HTTP响应内容的字符串形式,即,url对应的页面内容

r.encoding : 从HTTP header中猜测的相应内容编码方式 

r.apparent_encoding : 从内容中分析出的相应内容编码方式(备选编码方式)

r.content : HTTP响应内容的二进制形式

r.encoding :如果header中不存在charset,则认为编码为ISO-8859-1 。

r.apparent_encoding :根据网页内容分析出的编码方式可以 看作是r.encoding的备选。

Response的编码:

r.encoding : 从HTTP header中猜测的响应内容的编码方式;如果header中不存在charset,则认为编码为ISO-8859-1,r.text根据r.encoding显示网页内容

r.apparent_encoding : 根据网页内容分析出的编码方式,可以看作r.encoding的备选

爬取网页的通用代码框架

Requests库的异常

异常 说明
requests.ConnectionError 网络连接错误异常,如DNS查询失败拒绝连接等
requests.HTTPError HTTP错误异常
requests.URLRequired URL缺失异常
requests.ToolManyRedirects 超过最大重定向次数,产生重定向异常
requests.ConnectTimeout 连接远程服务器超时异常
requests.Timeout 请求URL超时,尝试超时异常

Response的异常

r.raise_for_status() : 如果不是200,产生异常requests.HTTPError;

在方法内部判断r.status_code是否等于200,不需要增加额外的if语句,该语句便于利用try-except进行异常处理

import requests

def getHTMLText(url):
try:


r = requests.get(url, timeout=30)


r.raise_for_status() # 如果状态不是200,引发HTTPError异常


r.encoding = r.apparent_encoding


return r.text

except: 


return "产生异常"

if __name__ == "__main__":

url = "http://www.baidu.com"

print(getHTMLText(url))

通用代码框架,可以使用户爬取网页变得更有效,更稳定、可靠。

HTTP协议

HTTP,Hypertext Transfer Protocol,超文本传输协议。

HTTP是一个基于“请求与响应”模式的、无状态的应用层协议。

HTTP协议采用URL作为定位网络资源的标识。

URL格式:http://host[:port][path]

· host:合法的Internet主机域名或IP地址
· port:端口号,缺省端口号为80
· path:请求资源的路径

HTTP URL的理解:

URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。

HTTP协议对资源的操作

方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,覆盖原URL位置资源
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源

理解PATCH和PUT的区别

假设URL位置有一组数据UserInfo,包括UserID、UserName等20个字段。

需求:用户修改了UserName,其他不变。

· 采用PATCH,仅向URL提交UserName的局部更新请求。

· 采用PUT,必须将所有20个字段一并提交到URL,未提交字段被删除。

PATCH的主要好处:节省网络带宽

Requests库主要方法解析

requests.request(method, url, **kwargs)

· method:请求方式,对应get/put/post等7种

例: r = requests.request('OPTIONS', url, **kwargs)

· url:拟获取页面的url链接

· **kwargs:控制访问的参数,共13个,均为可选项

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
'''

data:字典、字节序列或文件对象,作为Request的内容;

json:JSON格式的数据,作为Request的内容;

headers:字典,HTTP定制头;

hd = {'user-agent':'Chrome/10'}

r = requests.request('POST','http://www.yanlei.shop',headers=hd)

cookies:字典或CookieJar,Request中的cookie;

auth:元组,支持HTTP认证功能;

files:字典类型,传输文件;

fs = {'file':open('data.xls', 'rb')}

r = requests.request('POST','http://python123.io/ws',files=fs)

timeout:设定超时时间,秒为单位;

proxies:字典类型,设定访问代理服务器,可以增加登录认证

allow_redirects:True/False,默认为True,重定向开关;

stream:True/False,默认为True,获取内容立即下载开关;

verify:True/False,默认为True,认证SSL证书开关;

cert:本地SSL证书路径

#方法及参数
requests.get(url, params=None, **kwargs)
requests.head(url, **kwargs)
requests.post(url, data=None, json=None, **kwargs)
requests.put(url, data=None, **kwargs)
requests.patch(url, data=None, **kwargs)
requests.delete(url, **kwargs)

Python网络爬虫与信息提取(实例讲解)

网络爬虫引发的问题

性能骚扰:

受限于编写水平和目的,网络爬虫将会为web服务器带来巨大的资源开销

法律风险:

服务器上的数据有产权归属,网路爬虫获取数据后牟利将带来法律风险。

隐私泄露:

网络爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私。

网络爬虫的限制

·来源审查:判断User-Agent进行限制

检查来访HTTP协议头的User-Agent域,值响应浏览器或友好爬虫的访问。

· 发布公告:Roots协议

告知所有爬虫网站的爬取策咯,要求爬虫遵守。

Robots协议

Robots Exclusion Standard 网络爬虫排除标准

作用:网站告知网络爬虫哪些页面可以抓取,哪些不行。

形式:在网站根目录下的robots.txt文件。

案例:京东的Robots协议

http://www.jd.com/robots.txt

# 注释:*代表所有,/代表根目录
User-agent: * 
Disallow: /?* 
Disallow: /pop/*.html 
Disallow: /pinpai/*.html?* 
User-agent: EtaoSpider 
Disallow: / 
User-agent: HuihuiSpider 
Disallow: / 
User-agent: GwdangSpider 
Disallow: / 
User-agent: WochachaSpider 
Disallow: /

Robots协议的使用

网络爬虫:自动或人工识别robots.txt,再进行内容爬取。

Python网络爬虫与信息提取(实例讲解)

约束性:Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险。

Requests库网络爬虫实战

1、京东商品

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

2、亚马逊商品

# 直接爬取亚马逊商品是会被拒绝访问,所以需要添加'user-agent'字段
import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
 kv = {'user-agent':'Mozilla/5.0'} # 使用代理访问
 r = requests.get(url, headers = kv)
 r.raise_for_status()
 r.encoding = r.apparent_encoding
 print(t.text[1000:2000])
except:
 print("爬取失败")

3、百度/360搜索关键词提交

搜索引擎关键词提交接口

· 百度的关键词接口:

http://www.baidu.com/s?wd=keyword

· 360的关键词接口:

http://www.so.com/s?q=keyword

# 百度
import requests
keyword = "Python"
try:
 kv = {'wd':keyword}
 r = requests.get("http://www.baidu.com/s",params=kv)
 print(r.request.url)
 r.raise_for_status()
 print(len(r.text))
except:
 print("爬取失败")
# 360
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、网络图片的爬取和存储

网络图片链接的格式:

http://www.example.com/picture.jpg

国家地理:

http://www.nationalgeographic.com.cn/

选择一张图片链接:

http://image.nationalgeographic.com.cn/2017/0704/20170704030835566.jpg

图片爬取全代码
import requests
import os
url = "http://image.nationalgeographic.com.cn/2017/0704/20170704030835566.jpg"
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地址归属地的自动查询

www.ip138.com IP查询

http://ip138.com/ips138.asp?ip=ipaddress

http://m.ip138.com/ip.asp?ip=ipaddress

import requests
url = "http://m.ip138.com/ip.asp?ip="
ip = "220.204.80.112"
try:
 r = requests.get(url + ip)
 r.raise_for_status()
 r.encoding = r.apparent_encoding
 print(r.text[1900:])
except:
 print("爬取失败")
# 使用IDLE
>>> import requests
>>> url ="http://m.ip138.com/ip.asp?ip="
>>> ip = "220.204.80.112"
>>> r = requests.get(url + ip)
>>> r.status_code
>>> r.text

以上这篇Python网络爬虫与信息提取(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 图片验证码代码
Dec 07 Python
python模拟登陆阿里妈妈生成商品推广链接
Apr 03 Python
复习Python中的字符串知识点
Apr 14 Python
python中函数总结之装饰器闭包详解
Jun 12 Python
深入理解Python中的内置常量
May 20 Python
python使用KNN算法手写体识别
Feb 01 Python
python3.6使用pymysql连接Mysql数据库
May 25 Python
对python 命令的-u参数详解
Dec 03 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
python实现发送邮件
Mar 02 Python
python 将Excel转Word的示例
Mar 02 Python
Python开发的HTTP库requests详解
Aug 29 #Python
Python实现按学生年龄排序的实际问题详解
Aug 29 #Python
详解Python进程间通信之命名管道
Aug 28 #Python
基于Python闭包及其作用域详解
Aug 28 #Python
利用Python查看目录中的文件示例详解
Aug 28 #Python
Python如何通过subprocess调用adb命令详解
Aug 27 #Python
Python中序列的修改、散列与切片详解
Aug 27 #Python
You might like
用PHP实现将GB编码转换为UTF8
2006/11/25 PHP
php 分库分表hash算法
2009/11/12 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
thinkPHP基于ajax实现的菜单与分页示例
2016/07/12 PHP
thinkPHP5.0框架自动加载机制分析
2017/03/18 PHP
JQuery实现自定义对话框的代码
2008/06/15 Javascript
javascript iframe中打开文件,并检测iframe存在否
2008/12/28 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
jquery实现商品拖动选择效果代码(自写)
2013/05/28 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
超链接的禁用属性Disabled使用示例
2014/07/31 Javascript
JS获取下拉框显示值和判断单选按钮的方法
2015/07/09 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
2016/03/29 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
JavaScript中解决多浏览器兼容性23个问题的快速解决方法
2016/05/19 Javascript
Bootstrap实现登录校验表单(带验证码)
2016/06/23 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
node.js实现快速截图
2016/08/27 Javascript
Bootstrap使用基础教程详解
2016/09/05 Javascript
Vue2.X 通过AJAX动态更新数据
2018/07/17 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
python控制台显示时钟的示例
2014/02/24 Python
Python制作钉钉加密/解密工具
2016/12/07 Python
kali中python版本的切换方法
2019/07/11 Python
python 实现dict转json并保存文件
2019/12/05 Python
python中的逆序遍历实例
2019/12/25 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
软件工程专业推荐信
2013/10/28 职场文书
标准导师推荐信(医学类)
2013/10/28 职场文书
计算机相关专业自荐信
2014/07/02 职场文书
死亡赔偿协议书
2015/01/28 职场文书
小学生安全教育心得体会
2016/01/15 职场文书