Python运用正则表达式爬取糗事百科
一、开头
最近开始学习python爬虫,了解了python中一些强大的库,BeautifulSoup,requests,urllib等等,本文将使用正则表达式与requests库爬取糗事百科热门段子
二、分析网页信息
首先肯定是访问糗事百科主页(https://www.qiushibaike.com/),在这里使用的是requests库,代码如下:
url = "https://www.qiushibaike.com/
response = requests.get(url)
print(response.text)
嗯,使用requests确实就这么简单。可以看到终端上打印出了一大堆源码,很明显这里看源码太麻烦,我们可以去浏览器里看啊,我用的是Chrome,先分析一个段子的组成,有头像,昵称,内容,好笑数 如图
我们对其元素进行审查,可以快速定位到其标签位置,如图:![](http://i.imgur.com/cCMwF9N.png)
三、正则表达式进行匹配
如果对正则表达式不太熟悉,可以参考 正则表达式
#### 1. 获取昵称
原文标签
<a href="/users/33234810/" target="_blank" onclick="_hmt.push(['_trackEvent','web-list-author-text','chick'])"> <h2> Dr.fuckin… </h2>
- 正则表达式
exp = re.compile(r'<a.*?web-list-author-text.*?>\s*?<h2>\s*?(.*?)\s*?</h2>')
res = re.findall(exp,response.text)
#### 到这你会发现,只是个获取昵称而已,竟然这么麻烦,中间还出现了好多\s,*?这样的结构
- \s 匹配空白字符(\t\n..)
- * 表示匹配0次或者无限次
- ? 表示匹配一次或者无限次
- *? 非贪婪模式,表示尽量少的匹配
2. 获取内容
- #### 原文标签
<span>-><div class="content"->
<a href="/article/119442335" target="_blank" class="contentHerf" onclick="_hmt.push(['_trackEvent','web-list-content','chick'])">
<div class="content">
<span>
朋友小时候梦游。我们去他家住。早上起来看到他闭眼睛向厕所走。朋友回来后不久后听见他妈妈吼道,:这小兔崽子,旁边就是马桶,就向地上尿。<br/><br/>哈哈哈哈哈哈哈哈哈哈哈哈哈等会我先笑一会
</span>
- 正则表达式
exp1 = re.compile(r'<div.*?content">\s*?<span>\s*?(.*?)\s*?</span>')
res1 = re.findall(exp1,response.text)
print(res1)
细心观察会发现上面出现用了好多\s,因其在每个标签结尾处都使用了
<br>
进行换行,所以我们在匹配时必须要注意进行匹配,但会发现还是好麻烦,一个标签到下一个标签至少就有一个换行符,\s只针对空白字符。仔细想想 匹配符.
好像是可以匹配除\n
其他以外所有字符,但在DOTALL模式下也可以匹配\n
.
3. DOTALL模式匹配昵称,内容
- 正则表达式
exp2 = re.compile(r'<div class="article block.*?>.*?<h2>(.*?)</h2>.*?<span>(.*?)</span>',re.DOTALL)
res2 = re.findall(exp2,response.text)
print(res2)