python数据抓取与分析案例_吴裕雄--天生自然python学习笔记:WEB数据抓取与分析...

Web 数据抓取技术具有非常巨大的应用需求及价值,

用 Python 在网页上收集数据,不仅抓取数据的操作简单,

而且其数据分析功能也十分强大。

通过 Python 的时lib 组件中的 urlparse 函数,可轻松解

析指定网址的内容,在接收返回的 ParseResult 对象后,即

可通过其属性取出网址中各项有用信息 。

Python 还可进一步用 requests 函数抓取网页源代码,

再通过相关语句或正则表达式搜索得到指定的数据。

如果要抓取的数据比较复杂, Python 还可以通过功能

更为强大的网页解析工具 Beautifulsoup ,来对特定的网页

及目标进行抓取与分析。

网址解析

想要抓取网站的数据,必须先指定网址及所需参数 。因 此理解网址的构成方式

是进行网站数据抓取的基本技能。

以中国大陆地区 PM2.5 查询网站 http://www.prn25x.com/为例,其中的数据是

根据城市来查询的,如果要查询北京市的 PM2 .5 数据,则要在网址后面加上“ city/beijing.htm 飞即 h忧p://www.prn25x.com/city/beijing.htm

通过 Python 的 urlli b 组件中的 urlparse 函数,可以对网址进行解析,其返回值是

元组型 ParseResult 对象,通过该对象的属性就可以得到网址中的各项参数。

ParseResult 对象属性如下表 :

9d92cd616d90d6acfaee1aa59c92007c.png

例如:解析中国大陆地区 PM2.5 查询网站。

from urllib.parse importurlparse

url= 'http://www.pm25x.com/city/beijing.htm'o=urlparse(url)print(o)print("scheme={}".format(o.scheme)) #http

print("netloc={}".format(o.netloc)) #www.pm25x.com

print("port={}".format(o.port)) #None

print("path={}".format(o.path)) #/city/beijing.htm

print("query={}".format(o.query)) #空

335ef608352f544b89251f629530ab84.png

网页数据抓取

requests 用于抓取网页源代码,由于它比内置 urllib 模块好用,因此己经逐渐取

代了 urllib 模块。抓取源代码后可以用in 或正则表达式搜索获取所需的数据。

用 requests 抓取网页源代码

导入 reques也后,我们可用 requests .getO 函数模拟 HπP GET 方法发出 一个请求

( Request )到远程的服务器( Server ),当服务器接受请求后,就会响应( Response )井

返回网页内容(源代码),设置正确的编码格式,即可通过text 属性取得网址中的源代码 。

例如 : 以 GBK 编码抓取“万水书苑”的源代码。importrequests

url= 'http://www.wsbookshow.com/'html=requests.get(url)

html.encoding="GBK"

print(html.text)

faa545caede102d944a48afad25e7829.png

取得网页的源代码后,即可以对源代码加以处理。例如 : 以把每一行分割成列表,

并去除换行符。importrequests

url= 'http://www.wsbookshow.com/'html=requests.get(url)

html.encoding="gbk"htmllist=html.text.splitlines()for row inhtmllist:print(row)

94efce27e93f826c51db15e0e9329362.png

搜索指定字符串

用 text 属性取得的源代码其实是一大串字符串,如果想搜索其中指定的字符或

字符串,可使用 m 来完成。例如,查询是否含有“新概念”字符串。

357172e8f855c703d2de43f5068c70ab.png

也可以一行一行依次搜索,并统计该字符串出现次数 。 例如,搜索万水书苑网

站的首页出现“新概念”字符串的次数。

importrequests

url= 'http://www.wsbookshow.com/'html=requests.get(url)

html.encoding="gbk"htmllist=html.text.splitlines()

n=0for row inhtmllist:if "新概念" inrow:

n+=1

print("找到 {} 次!".format(n))

9854292a7a9fbda8eec52722513c41ea.png

用正则表达式抓取网页内容

实际应用中,我们需搜索的字符串可能较复杂,有时用 m 根本无法完成。比如

要搜索网站中的超链接、电话号码等,对这种复杂搜索,就要用到正则表达式了。

正则表达式的英文全称是 regu lar expression (简称 regex ) 。 正则表达式就是由类

似 Windows 中搜索文件时用到的通配符符号所构成的公式,用于实现字符串的复杂

搜索 。

网站 http ://pythex.org/可以测试正则表达式的结果是否正确 。 假如我们要用正则

表达式表达一 串整数数字,可以用“[O123456789] +这个表达式”,其中,中括号 门

中的一堆字符表示合法的字符,后面的加号“+”表示重复1次或无数次,因此,该

表达式就可以表达像126706 、 9902 、 8 等样式的数字 。

在正则表达式中,为了简化输入,还可以用“ [ 0-9] +这样的缩写”表达同样的含

义,其中的 0-9 其实就表示了 01234567890 甚至我们还可以再度缩写成[\d] +,其中的 \d

就表示由数字所构成的字符集合。

常见的正则表达式功能介绍

fd1482be5af9b2ba87592c0ca60f937f.png

eeb3170dccf1d4723bff9a16973beb0f.png

14d0a98d89a516d72dd2ac0ab275c6c8.png

de0e7b51fa939aafd9537f1da2f18dff.png

创建正则表达式对象

要使用 正则表达式, 需要先导入 re 包,再用 re 包提供的 compile 方法创建一个

正则表达式对象,语法如下 :

0853c128834bf5543274453e4f90ae4a.png

创建正则表达式对象后,再利用正则表达式对象的方法搜索指定的字符串。正

则表达式对象包含了下列方法 :

539e0bdd2473b96f42e5c2c9fb7dcaf6.png

match (string)方法

在 s tring 中查找符合正则表达式规则的字符串,遇到第一个不符合字符时结束查找,并把结果存入 match 对象( obj e ct )中 : 若没找到符合的字符,返回 None 。

importre

pat= re . compile ( ’ [a - z ]+’ )

m=pat . match (’ teml2po ’ ) #简便起见,我们把 ma tc h 对象的伯赋给 mprint(m)

上例会返回"<_sre.SRE_Match object; s pan=( O,匀, mat c h=’ te rn’〉 ”对象, 并将结

果存入 match 对象中。我们通过 match 对象的方法即可得到相应的结果 。

match 对象包含的方法如下 :

5b0dd0a16710f518f2e1ced5bafd754b.png

89b85a7a5047d94fcd3a02e97534b2cf.png

直接调用 re.match ()方法

直接调用的语法格式为 r巳 . match ( 正则表达式,搜索字符串)。它包含两个参 .

数, 习 惯上我们会在第一个参数前加上r字符,用于告诉编译器这个参数是正则表 :

达式;第 二个参数传递待投索的字符串,这样就可省去先用 r e.co mpil e 方法创建正’

: 则表达式的 步骤.

importre

m= re.match(r'[a-z]+','tem12po')print(m)if not m==None:print(m.group())print(m.start())print(m.end())print(m.span())

f6bd1e0ac7a4678dd9376e880cb9da2f.png

8e14b2e24807f2deef201bad2c0b04bd.png

e12bb60f883c8cb0430e93c5c58fc6c5.png

importre

pat= re.compile('[a-z]+')

m= pat.search('3tem12po')print(m) #<_sre.sre_match object span="(1," match="tem">

if not m==None:print(m.group()) #tem

print(m.start()) #1

print(m.end()) #4

print(m.span()) #(1,4)

075fbfbfec0931b5f74c2f99d03fe964.png

上例若用 match 方法搜索 ,得到的结果将会是 None 。

c9e7827ff6c98cfdee037e30224515a8.png

例如 ,用

findall 方法搜索“ teml2po ”字符串,代码如下 。

importre

pat= re.compile('[a-z]+')

m= pat.findall('tem12po')print(m) #['tem', 'po']

84419e2b6dd577f4e818a6701e2fdad0.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值