无意间发现一个有免费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(手动防河蟹)工具对应的配置文件,工具都打包好了,下载链接:你懂得