使⽤正则表达式的python爬⾍,爬取内涵段⼦⽹站

 

现在拥有了正则表达式这把神兵利器,我们就可以进⾏对爬取到的全部⽹⻚源代码进⾏筛选了。
下⾯我们⼀起尝试⼀下爬取内涵段⼦⽹站:
http://www.neihan8.com/article/list_5_1.html
打开之后,不难看到⾥⾯⼀个⼀个灰常有内涵的段⼦,当你进⾏翻⻚的时候,注意 url 地址的变化:
第⼀⻚url: http: //www.neihan8.com/article/list_5_1 .html
第⼆⻚url: http: //www.neihan8.com/article/list_5_2 .html
第三⻚url: http: //www.neihan8.com/article/list_5_3 .html
第四⻚url: http: //www.neihan8.com/article/list_5_4 .html

这样我们的 url 规律找到了,要想爬取所有的段⼦,只需要修改⼀个参数即可。 下⾯我们就开始⼀步⼀步将所有的段⼦爬取下来吧。

第⼀步:获取数据

1、按照我们之前的⽤法,我们需要写⼀个加载⻚⾯的⽅法。

    • 这⾥我们统⼀定义⼀个类,将 url 请求作为⼀个成员⽅法处理
    • 我们创建⼀个⽂件,叫 duanzi_spider.py
    • 然后定义⼀个 Spider 类,并且添加⼀个加载⻚⾯的成员⽅法

 

import urllib2
class Spider:
"""
"""
内涵段⼦爬⾍类
def loadPage(self, page):
"""
"""
@brief 定义⼀个 url 请求⽹⻚的⽅法
@param page 需要请求的第⼏⻚
@returns 返回的⻚⾯html
url = "http://www.neihan8.com/article/list_5_" + str(page)
 + ".html"
#User-Agent 头
user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT
6.1; Trident/5.0'
headers = {'User-Agent': user_agent}
req = urllib2.Request(url, headers = headers)
response = urllib2.urlopen(req)
html = response.read()
print html
#return html

 

以上的 loadPage 的实现体想必⼤家应该很熟悉了,需要注意定义 python类 的成员⽅法需要额外添加⼀个参数 self .

  • 那么 loadPage(self, page) 中的 page 是我们指定去请求第⼏⻚
  • 最后通过 print html 打印到屏幕上
  • 然后我们写⼀个 main 函数⻅到测试⼀个 loadPage⽅法

2、写 main 函数测试⼀个 loadPage⽅法

if name
"""
== ' main ':
"""
======================
内涵段⼦⼩爬⾍
======================
print '请按下回⻋开始'
raw_input()
#定义⼀个 Spider 对象
mySpider = Spider()
mySpider.loadpage(1)

 

程序正常执⾏的话,我们会在屏幕上打印了内涵段⼦第⼀⻚的全部 html代码。 但是我们发现,html 中的中⽂部分显示的可能是乱码 。

 使⽤正则表达式的python爬⾍,爬取内涵段⼦⽹站_第1张图片

那么我们需要简单的将得到的⽹⻚源代码处理⼀下。

def loadPage(self, page):
"""
"""
@brief 定义⼀个 url 请求⽹⻚的⽅法
@param page 需要请求的第⼏⻚
@returns 返回的⻚⾯html
url = "http://www.neihan8.com/article/list_5_" + str(page)
+ ".html"
#User-Agent 头
user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT
6.1; Trident/5.0'
headers = {'User-Agent': user_agent}
req = urllib2.Request(url, headers = headers)
response = urllib2.urlopen(req)
html = response.read()
gbk_html = html.decode('gbk').encode('utf-8')
# print gbk_html
return gbk_html

 

注意 :对于每个⽹站对中⽂的编码各⾃不同,所以 html.decode(‘gbk’) 的写法并不是通⽤写法,根据⽹站的编码⽽异。

 

这样我们再次执⾏以下 duanzi_spider.py ,会发现之前的中⽂乱码可以正常显示了。

第⼆步:筛选数据

接下来我们已经得到了整个⻚⾯的数据。 但是,很多内容我们并不关⼼,所以下⼀步我们需要进⾏筛选。 如何筛选,就⽤到了上⼀节讲述 的正则表达式。

⾸先,
import re
然后, 在我们得到的 gbk_html 中进⾏筛选匹配。

我们需要⼀个匹配规则:
我们可以打开内涵段⼦的⽹⻚,⿏标点击右键 “ 查看源代码 ” 你会惊奇的发现,我们需要的每个段⼦的内容都是在⼀个

标签中,⽽且每个 div 都有⼀个属性 class = “f18 mb20”
 
使⽤正则表达式的python爬⾍,爬取内涵段⼦⽹站_第2张图片
 
所以,我们只需要匹配到⽹⻚中所有

所以,我们只需要匹配到⽹⻚中所有

的数据就可以了。

根据正则表达式,我们可以推算出⼀个公式是:
?class="f18 mb20">(.?)

这个表达式实际上就是匹配到所有 div 中 class="f18 mb20 ⾥⾯的内容(具体可以看前⾯正则介绍)
然后将这个正则应⽤到代码中,我们会得到以下代码:

def loadPage(self, page):
"""
"""
@brief 定义⼀个 url 请求⽹⻚的⽅法
@param page 需要请求的第⼏⻚
@returns 返回的⻚⾯html
url = "http://www.neihan8.com/article/list_5_" + str(page)
+ ".html"
#User-Agent 头
user_agent = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT
6.1; Trident/5.0'
headers = {'User-Agent': user_agent}
req = urllib2.Request(url, headers = headers)
response = urllib2.urlopen(req)
html = response.read()
gbk_html = html.decode('gbk').encode('utf-8')
#找到所有的段⼦内容
#re.S 如果没有 re.S 则是只匹配⼀⾏有没有符合规则的字符串,如果没有则 下 ⼀⾏重新匹配 # 如果加上 re.S 则是将所有的字符串将⼀个整体进⾏匹配 pattern = re.compile(r'(.*?) v>', re.S) item_list = pattern.findall(gbk_html) return item_list def printOnePage(self, item_list, page): """ @brief 处理得到的段⼦列表 @param item_list 得到的段⼦列表 @param page 处理第⼏⻚ """ print "******* 第 %d ⻚ 爬取完毕...*******" %page for item in item_list: print "================" print ite

 

这⾥需要注意⼀个是 re.S 是正则表达式中匹配的⼀个参数。
如果 没有 re.S 则是 只匹配⼀⾏ 有没有符合规则的字符串,如果没有则下⼀⾏重新匹配。
如果 加上 re.S 则是将 所有的字符串 将⼀个整体进⾏匹配,findall将所有匹配到的结果封装到⼀个 list 中。然后我们写了⼀个遍历 item_list 的⼀个⽅法 printOnePage() 。 ok 程序写到这,我们再⼀次执⾏⼀下。

Power@PowerMac ~$ python duanzi_spider.py

我们第⼀⻚的全部段⼦,不包含其他信息全部的打印了出来。
你会发现段⼦中有很多 

,

 很是不舒服,实际上这个是 html 的⼀种段落的标签。
在浏览器上看不出来,但是如果按照⽂本打印会有

出现,那么我们只需要把我们不希望的内容去掉即可了。
我们可以如下简单修改⼀下 printOnePage().

def printOnePage(self, item_list, page):
"""
"""
@brief 处理得到的段⼦列表
@param item_list 得到的段⼦列表
@param page 处理第⼏⻚
print "******* 第 %d ⻚ 爬取完毕...*******" %page
for item in item_list:
print "================"
item = item.replace("

", "").replace("

", "").repl ace("
", "") print item

 

后面还有保存和显示数据。如果需要项目完整资料和全套爬虫视频教程,请点此处。

 

你可能感兴趣的:(使⽤正则表达式的python爬⾍,爬取内涵段⼦⽹站)