爬虫|使?正则表达式的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?法
if name
"""
== ' main ':
"""
======================
内涵段??爬?
======================
print '请按下回?开始'
raw_input()
#定义?个 Spider 对象
mySpider = Spider()
mySpider.loadpage(1)
程序正常执?的话,我们会在屏幕上打印了内涵段?第??的全部 html代码。 但是我们发现,html 中的中?部分显示的可能是乱码 。
文章图片
那么我们需要简单的将得到的??源代码处理?下。
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爬?,爬取内涵段??站】
文章图片
所以,我们只需要匹配到??中所有
到 的数据就可以了。
根据正则表达式,我们可以推算出?个公式是:
?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'(.*?)', 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
后面还有保存和显示数据。如果需要项目完整资料和全套爬虫视频教程,请点此处。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- Python爬虫|Python爬虫 --- 1.4 正则表达式(re库)