当前位置: 首页 > 后端技术 > Python

Python爬虫使用正则表达式爬取内涵网站

时间:2023-03-26 18:55:55 Python

既然有了正则表达式这个法宝,我们就可以把爬取的网页源代码全部过滤掉。一起来试试爬取内涵段子网站:http://www.neihan8.com/articl...打开后不难看出,里面经常有灰色和内涵段子。翻页时注意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类,添加一个加载页面的成员方法importurllib2classSpider:""""""内涵段爬虫类defloadPage(self,page):""""""@brief定义一个网页的url请求方法@parampage请求的第一个页面@returns返回页面htmlurl="http://www.neihan8.com/article/list_5_"+str(page)+".html"#User-Agentheaderuser_agent='Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0'headers={'User-Agent':user_agent}req=urllib2.Request(url,headers=headers)response=urllib2.urlopen(req)html=response.read()printhtml#上面的loadPage的实现returnhtml大家一定不陌生,需要注意的是多了一个参数self来定义的成员方法python类然后loadPage(self,page)中的page就是我们指定请求的页数最后通过printhtml把page打印到屏幕上然后我们写一个mainfunc测试loadPage方法2.编写一个main函数来测试loadPage方法ifname"""=='main':"""=====================================================================打印'PleasepressEntertostart'raw_input()#DefineaSpiderobjectmySpider=Spider()mySpider.loadpage(1)如果程序正常执行,我们会将内涵段第一页的所有html打印在屏幕代码上.但是我们发现html的中文部分可能会显示乱码。那么我们需要对获取到的网页源码进行简单的处理。defloadPage(self,page):""""""@brief定义一个url方法请求一个网页@parampage要请求的页面@returns返回的页面htmlurl="http://www.neihan8.com/article/list_5_"+str(page)+".html"#User-Agentheaderuser_agent='Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.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')#打印gbk_htmlreturngbk_html注意:对于每个网站,中文的编码是不一样的,所以html.decode('gbk')的写法不通用,根据网站的编码不同。所以我们再执行运行下面的duanzi_spider.py,你会发现前面的中文乱码可以正常显示了第二步:过滤数据接下来我们就获取到了整个页面的数据,不过很多内容我们并不关心,所以接下来步骤我们需要过滤呃。如何过滤,我们使用上一节介绍的正则表达式。首先导入re,然后在我们得到的gbk_html中过滤匹配。我们需要一个匹配规则:我们可以打开内涵段子的网页,右键“查看源代码”,你会惊奇地发现,我们需要的每一个段子的内容都在一个

标签中,每个div都有a属性class="f18mb20",所以我们只需要匹配网页中从
的所有数据即可。根据正则表达式,我们可以推导出一个公式为:(.?)
这个表达式实际上匹配了所有class="f18mb20的div页面的内容(具体见上面的正则介绍)然后把这个正则应用到代码中,我们会得到如下代码:defloadPage(self,page):""""""@brief定义了一个url请求网络Page的方法@parampage请求的页数@returns返回的页面htmlurl="http://www.neihan8.com/article/list_5_"+str(page)+".html"#User-Agentheadersuser_agent='Mozilla/5.0(兼容;MSIE9.0;WindowsNT6.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,只会匹配一行中是否有符合规则的字符串,如果没有,th下一行将被重新匹配。#如果加了re.S,所有的字符串都会作为一个整体来处理pattern=re.compile(r'(.*?)
',re.S)item_list=pattern.findall(gbk_html)returnitem_listdefprintOnePage(self,item_list,page):"""@brief处理段列表@paramitem_list获取段列表@parampage要处理的页面"""print"*********%d页面抓取Fetchingfinished...*******"%pageforiteminitem_list:print"=================="这里打印item需要注意一个是re.S是正则表达式中的匹配参数,如果没有re.S,则只匹配一行,如果没有符合规则的字符串,不符合则重新匹配下一行。如果加上re.S,所有的字符串会作为一个整体进行匹配,findall会把所有匹配到的结果封装成一个列表。然后我们写了一个遍历item_list的方法printOnePage()。好了,程序就写到这里了,我们再次执行它Power@PowerMac~$pythonduanzi_spider.py我们第一页的所有段落,不包括其他信息,全部打印出来,你会发现有很多

,

很是不舒服,其实这是一个html的段落标签,在浏览器上是看不到的,但是如果按照文本打印出来,就会出现

,所以我们只需要去掉我们不要的内容就行了现在不需要。我们可以简单地修改将printOnePage().def定义如下printOnePage(self,item_list,page):""""""@brief处理段列表@paramitem_list获取段列表@parampage处理第几页打印"*******页%d抓取完成...******"%pageforiteminitem_list:print"================"item=item.replace("

","").replace("

","").replace("
","")打印项后面是保存和显示数据。如果您需要完整的项目资料和全套爬虫视频教程,请点击这里。