Python爬虫之利用正则表达式爬取内涵吧

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python爬虫之利用正则表达式爬取内涵吧相关的知识,希望对你有一定的参考价值。

首先,我们来看一下,爬虫前基本的知识点概括

技术分享

一. match()方法:

这个方法会从字符串的开头去匹配(也可以指定开始的位置),如果在开始没有找到,立即返回None,匹配到一个结果,就不再匹配。

我们可以指定开始的位置的索引是3,范围是3-10,那么python将从第4个字符‘1‘开始匹配,只匹配一个结果。

group()获得一个或多个分组的字符串,指定多个字符串时将以元组的形式返回,group(0)代表整个匹配的字串,不填写参数时,group()返回的是group(0)。

 1 import re
 2 
 3 pattern = re.compile(r\\d+)     #匹配数字一次以上
 4 m = pattern.match(one123two456)
 5 print m
 6 print m.group()
 7 
 8 #None
 9 #...AttributeError: ‘NoneType‘ object has no attribute ‘group‘
10 
11 
12 pattern = re.compile(r\\d+)     #匹配数字一次以上
13 m = pattern.match(one123two456. 3, 10)
14 print m
15 print m.group()
16 
17 #<_sre.SRE_Match object at 0x00000000026FAE68>
18 #123

二. search()方法:

search方法与match比较类似,区别在于match()方法只检测是不是在字符串的开始位置匹配,search()会扫描整个字符串查找匹配,同样,search方法只匹配一次。

1 import re
2 
3 pattern = re.compile(r\\d+)
4 m = pattern.search(one123two456)
5 print m.group()
6 
7 #123

三. findall()方法:

搜索字符串,以列表的形式返回全部能匹配的字串。

1 import re
2 
3 pattern = re.compile(r\\d+)
4 m = pattern.findall(one123two456)
5 print m
6 
7 #[‘123‘, ‘456‘]

四. sub()方法:

用来替换每一个匹配的字符串,并返回替换后的字符串。

1 import re
2 
3 pattern = re.compile(r\\d+)
4 m = pattern.sub(abc, one123two456)
5 print m
6 
7 #oneabctwo456

五. 实践:爬取内涵吧段子

 1 #-*-coding:utf-8-*-
 2 
 3 import requests
 4 import re
 5 
 6 class Spider:
 7 
 8     def __init__(self):
 9         self.page = 1
10 
11     def getPage(self, page):
12         url = "http://www.neihan8.com/article/list_5_{}.html".format(page)
13         response = requests.get(url)
14         contents =  response.content.decode(gbk)   #查看网页源代码,内涵吧默认编码是charset=gb2312
15         return contents
16 
17     def getContent(self):
18         contents = self.getPage(self.page) 
19         pattern = re.compile(<h4>.*?<a href.*?html">(.*?)</a>.*?class="f18 mb20">(.*?)</div>, re.S)
20         results = pattern.findall(contents)
21         contents = []
22         for item in results:
23             title = re.sub(<b>|</b>, "", item[0])
24             content = re.sub(r<p>|</p>|<br />|&\\w+;|<img alt.*|<div style=.*>|<div>|<p style="text-align: center; ">, "", item[1])
25             content = re.sub(r<div class="upload-txt.*baseline;">|<h1 class="title".*vertical-align: baseline;">|</h1>, "", content)
26             content = re.sub(r<div class=.*onclick="showAnswer(this)">|</a><div class="answer">, "", content)
27             content = re.sub(r<span style="color: rgb.*;">, "", content)
28             contents.append([title, content])
29         return contents
30 
31     def save_Data(self):
32         file = open("duanzi.txt", "w+")
33         x = 1
34         y = 1
35         for self.page in range(0, 507):
36             contents = self.getContent()
37             print u"正在写入第%d页的数据..." %(self.page+1)
38             for item in contents:
39                 file.write(str(x) + "." + item[0])
40                 file.write("\\n")
41                 file.write(item[1])
42                 file.write("=====================================================================================\\n\\n")
43                 if item==contents[-1]:
44                     file.write(u"********第" + str(y) + "页完********\\n\\n")
45                     y += 1
46                 x += 1            
47         print u"所有页面已加载完"
48 
49     def start(self):
50         self.save_Data()
51                 
52                              
53 spider = Spider()
54 spider.start()

基本上可以获取段子的标题和内容,但由于内涵吧的段子越到后面标签越复杂,所以给替换标签带来了很大的难度。

以上是关于Python爬虫之利用正则表达式爬取内涵吧的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫_案例:使用正则表达式的爬虫

Python爬虫之利用BeautifulSoup爬取豆瓣小说——将小说信息写入文件

非结构化数据与结构化数据提取---- 案例:使用正则表达式的爬虫

用正则表达式爬取古诗文网站,边玩边学python爬虫入门进阶(09)

用正则表达式爬取古诗文网站,边玩边学python爬虫入门进阶(09)

python爬虫入门练习,使用正则表达式和requests爬取LOL官网皮肤