当前位置: > python爬虫 >

Python爬虫正则表达式解析网页及Json序列化详情
栏目分类:python爬虫   发布日期:2019年01月27日 17:40:27   浏览次数:

         如果你经常需要访问某个网站去得到最新的VPS网页密码,想要偷个懒,去避免重复进行这些有规律重复的事情,那就可以编写一个小程序,使用PYTHON编写一个小爬虫工具。总结如下

用python

一,首先读取网页,使用电脑自带的utllib.request模块,使用import导入,应用下列函数

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
 
#example
import urllib.request
 
url = "http://www.ishadowsocks.net/"
html = urllib.request.urlopen(url).read()
html = html.decode("utf-8")
print(html)
 
#print:结果太长就不打出来了 =。=

二,然后用read()函数读取它的二进制流,在破译好的字符串中挑选我们所需的数据,就用

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

re.search来检查匹配字符串的任何位置, 若你需要获取网页中符合如下要求的字符串
<h4>....</h4>

那么就得使用以下正则表达式,
<h4>((.|\r|\n)*?)</h4>
 
#example
import re
 
data = "<h3>abc</h3><h4>abc</h4><h4>123</h4>"
pattern = "<h4>((.|\r|\n)*?)</h4>"
res = re.search(pattern, data)
print(res.group())
print(res.group(1))
 
#print:<h4>abc</h4>
#print:abc

其后加了个问号,是为了开启非贪婪模式,以避免重复匹配结尾字符串,re.search()只可以匹配首个符合要求的字符串,若需要获得所有有匹配的字符串,则需运用到以下函数
re.findall(pattern, string, flags=0)
 
#example
import re
 
pattern = "<h4>(.*?)</h4>"
data = "<h4>p</h4><h4>y</h4><h4>交易</h4>"
 
res = re.findall(pattern, data)
for i in res:
    print(i[0])
 
#print:p
#print:y
#print:交易

三,通过这些方法仔细搜查你想要的数据,当所需数据在一个字符串中,可以使用(?P<c>…来代表其中匹配数据,运用如下正则表达式,

<h1>(?P<a>.*?)</h1><h2>(?P<b>.*?)</h2><h3>(?P<c>.*?)</h3>
 
#example
import re
 
pattern = "<h1>(?P<a>.*?)</h1><h2>(?P<b>.*?)</h2><h3>(?P<c>.*?)</h3>"
data = "<h1>Hello</h1><h2>world</h2><h3>!</h3>"
res = re.match(pattern,data)
res = res.groupdict()
 
print(res["a"])
print(res["b"])
print(res["c"])
 
#print:Hello
#print:world
#print:!

四,这样你所需要的数据就可以解析出来了,但程序中只支持Json文件,所以还需要把数据进行变换,做法是,先创建一个class,然后序列化这个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
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"
}
'''

五,在这期间值得关注的是,为了支持中文需要将ensure_ascil设置成处true,indent用于设置缩进,最后以utf-8编码编入文件,

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

这样免费的VPS爬虫就写好了,把它运行之后就会生成翻墙工具对应的配置文件
 
 
 

相关热词:

相关内容
热门关键词
python字符串
     
python教程 python爬虫 python人工智能 Python+大数据 python问答