[Python]爬虫,正则表达式解析网页及Json序列化

无意间发现一个有免费VPS的网站,但是密码时常更新,需要经常访问这个网站去获取最新的密码。作为一个喜欢偷懒的程序猿,怎么能容忍不断做这种有规律重复的事情呢?妥妥的可以交给程序去做嘛~所以突击学习了以下Python3,写了一个小爬虫工具,在此做下总结,以防忘记了,毕竟遇到了许多问题,哈哈。

一步步来!
需要读取网页,所以我使用了自带的urllib.request模块,在开头用import导入,这点到和Java相似(虽然我不搞Java,=。=)。
该模块实现了客户端的Http和Https协议,可以通过url来请求数据。
在此只需要用到以下函数

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) 
#example
import urllib.request

url = "http://www.is.net/"
html = urllib.request.urlopen(url).read()
html = html.decode("utf-8")
print(html)

#print:结果太长就不打出来了 =。=

传入一个连接即可。
成功后可以使用read()函数来读取其二进制流,因为打开的网页是“utf-8”编码的,所以使用decode(“utf-8”)方法,将其解码到unicode,以便于在程序中处理。

得到解码后的字符串后,就需要从中间过滤出我们想要的数据。可以使用

re.match(pattern, string, flags=0) 
re.search(pattern, string, flags=0)

re.match()检查匹配只有开头的字符串,而re.search()检查匹配字符串的任何地方。所以使用的是后者。
如果你想要获得网页中符合如下要求的字符串

<h4>....h4>

可以使用下列正则表达式

<h4>((.|\r|\n)*?)h4>
#example
import re

data = "

abc

abc

123

"
pattern = "

((.|\r|\n)*?)

"
res = re.search(pattern, data) print(res.group()) print(res.group(1)) #print:

abc

#print:abc

*后面加一个?是为了使用非贪婪模式,以免重复匹配结尾字符串。
re.search()函数只能匹配第一个符合要求的字符串,如果想要获得说有匹配的字符串的话,就需要使用到如下函数

re.findall(pattern, string, flags=0) 
#example
import re

pattern = "

(.*?)

"
data = "

p

y

交易

"
res = re.findall(pattern, data) for i in res: print(i[0]) #print:p #print:y #print:交易

通过以上的方法不断的细化想查找的数据。
当要数据在一个字符串中时,可以使用”(?P<名字>…)”来表示其中匹配的数据,然后后面匹配完成后就可以根据这个名字来获取对应匹配的值。举个例子:
如果要将“Hello”、“world”、“!”一次性解析出来

<h1>Helloh1><h2>worldh2><h3>!h3>

可以使用如下正则表达式

<h1>(?P<a>.*?)h1><h2>(?P<b>.*?)h2><h3>(?P<c>.*?)h3>
#example
import re

pattern = "

(?P.*?)

(?P.*?)

(?P.*?)

"
data = "

Hello

world

!

"
res = re.match(pattern,data) res = res.groupdict() print(res["a"]) print(res["b"]) print(res["c"]) #print:Hello #print:world #print:!

至此,想要的数据就可以解析出来了,但是在程序中要使用的是Json文件,所以还要将数据组织成Json。下面就来讲讲Python的序列化成Json。

我的做法是,按照需要的Json数据格式创建一个class,然后序列化它!
在此我使用的序列化方法是

json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw) 

json.dumps()是将obj序列化成str,而json.dump()则将其序列化成stream。

import json

class Info:
    name = ""
    phoneNumber = ""

class Info2:
    age = 1


data = Info()
data.name = "XiangMu"
data.phoneNumber = "123456789"

#追加Json内容,global为关键字,可以使用这种方式添加
setattr(data,"global","abc")

res = json.dumps(data.__dict__, ensure_ascii=False,indent=4)

print(res)

#print
'''
{
    "name": "XiangMu",
    "global": "abc",
    "phoneNumber": "123456789"
}
'''

序列化成Json时,需要注意的是json.dumps()有个参数“ensure_ascii”用于设置序列化后的Json字符串是ASCII还是UNICODE,在此为了支持中文,将该参数设置成True。“indent”用于设置缩进。

至此得到了Json数据,最后就是以“utf-8”编码写入到文件中。

import codecs

data = "Python从入门到交易"
fp = codecs.open("test.json","w+","utf-8")
fp.write(data)
fp.close()

文本内容:
这里写图片描述

最后,放出写好了的免费VPS扒虫,运行后会生成FanQiang(手动防河蟹)工具对应的配置文件,工具都打包好了,下载链接:你懂得

[Python]爬虫,正则表达式解析网页及Json序列化_第1张图片

你可能感兴趣的:(Python)