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爬取Coursera课程资源的详细过程
Nov 04 Python
仅利用30行Python代码来展示X算法
Apr 01 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Django框架教程之正则表达式URL误区详解
Jan 28 Python
Python实现的读取电脑硬件信息功能示例
May 30 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
Nov 06 Python
python读取并写入mat文件的方法
Jul 12 Python
python的pygal模块绘制反正切函数图像方法
Jul 16 Python
使用python实现滑动验证码功能
Aug 05 Python
Python selenium的基本使用方法分析
Dec 21 Python
python中yield的用法详解
Jan 13 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第一次无法获取cookie问题处理
2014/12/15 PHP
php动态生成缩略图并输出显示的方法
2015/04/20 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
javascript实现颜色渐变的方法
2013/10/30 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
js/jquery判断浏览器类型的方法小结
2015/05/12 Javascript
JavaScript tab选项卡插件实例代码
2016/02/23 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
Vue 实现手动刷新组件的方法
2019/02/19 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
python实现清屏的方法
2015/04/30 Python
python绘制简单折线图代码示例
2017/12/19 Python
Python如何获得百度统计API的数据并发送邮件示例代码
2019/01/27 Python
python实现猜拳小游戏
2020/04/05 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
python中adb有什么功能
2020/06/07 Python
python属于哪种语言
2020/08/16 Python
python3判断IP地址的方法
2021/03/04 Python
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
巴西儿童时尚购物网站:Dinda
2019/08/14 全球购物
上海方立数码笔试题
2013/10/18 面试题
汇智创新科技发展有限公司
2015/12/06 面试题
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
应届生法律求职信
2013/10/22 职场文书
土木工程个人自荐信范文
2013/11/30 职场文书
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
2021/04/01 PHP