分析页面代码
从这段代码中可以找到很多规律,例如,每条博客的所有信息都包含在一个
<div> 节点中,这个<div>节点的class属性值都是post-item-text,每一条博客的标题和URL都包含在一个<a>节点中,这个<a> 在,节点的class属性值是post-item-title。根据这些规律,很容易过滤出想要的信息。由于本例只需要得到:
博客的标题和URL,所以只关注 <a> 节点即可。本例的基本原理就是通过正则表达式过滤出所有class属性值为titlelenk的 <a>
节点,然后从 <a>节点中提炼出博客标题和URL。
分析正则表达式
<a class="post-item-title" href="https://www.cnblogs.com/lianghong881018/p/15169424.html" target="_blank">基于RT1052 Aworks 内存扩容记录(一)</a>
这个是<a>的内容得到以下正则表达式
<a[^>]*post-item-title[^>]*>[^<]*</a>
[^>]*
:是匹配出来>
字符的所有字符,在这里匹配class="
,下一个则是匹配" href="https://www.cnblogs.com/lianghong881018/p/15169424.html" target="_blank"
完整代码
from urllib3 import *
from re import *
http = PoolManager()
disable_warnings()
def download(url):
result = http.request('GET',url)
htmlStr = result.data.decode('utf-8')
return htmlStr
def analyse(htmlStr):
aList = findall('<a[^>]*post-item-title[^>]*>[^<]*</a>',htmlStr)
result = []
for a in aList:
g = search('href[\s]*=[\s]*[\'"]([^>\'""]*)[\'"]',a)
if g!=None:
url = g.group(1)
index1 = a.find(">")
index2 = a.rfind("<")
title = a[index1+1:index2]
d = { }
d['url'] = url
d['title'] = title
result.append(d)
return result
def crawler(url):
html = download(url)
blogList = analyse(html)
for blog in blogList:
print('title: ',blog['title'])
print('url: ', blog['url'])
crawler('https://www.cnblogs.com')