1. 首页
  2. IT资讯

Python爬虫实战教程,教你爬 内涵段子站,有源码

“u003Cdivu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002F46df00004460a5665cbc” img_width=”400″ img_height=”263″ alt=”Python爬虫实战教程,教你爬 内涵段子站,有源码” inline=”0″u003Eu003Cu002Fpu003Eu003Cpu003E今天就给大家介绍python是如何爬出内涵段子网站的全过程!u003Cu002Fpu003Eu003Cpu003EPython程序员必会的案例教程!u003Cu002Fpu003Eu003Cpu003E这就是我们要爬取的网站: http:u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_1.htmlu003Cu002Fpu003Eu003Cpu003E打开之后,不难看到里面一个一个灰常有内涵的段子,当你进行翻页的时候,注意url地址的变化:u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003E第一页url: http: u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_1 .htmlu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E第二页url: http: u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_2 .htmlu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E第三页url: http: u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_3 .htmlu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E第四页url: http: u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_4 .htmlu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E这样我们的url规律找到了,要想爬取所有的段子,只需要修改一个参数即可。 下面我们就开始一步一步将所有的段子爬取下来吧。u003Cu002Fpu003Eu003Cpu003E第一步:获取数据u003Cu002Fpu003Eu003Cpu003E1. 我们需要写一个加载页面的方法。u003Cu002Fpu003Eu003Cpu003E这里我们统一定义一个类,将url请求作为一个成员方法处理。u003Cu002Fpu003Eu003Cpu003E我们创建一个文件,叫duanzi_spider.pyu003Cu002Fpu003Eu003Cpu003E然后定义一个Spider类,并且添加一个加载页面的成员方法:u003Cu002Fpu003Eu003Cpreu003Eimport urllib2class Spider: “””u003Cbru003E内涵段子爬虫类u003Cbru003E”””u003Cbru003Edef loadPage(self, page):u003Cbru003E”””u003Cbru003E@brief 定义一个url请求网页的方法u003Cbru003E@param page 需要请求的第几页u003Cbru003E@returns 返回的页面htmlu003Cbru003E”””u003Cbru003Eurl = “http:u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_” + str(page) + “.html”u003Cbru003E#User-Agent头u003Cbru003Euser_agent = ‘Mozillau002F5.0 (compatible; MSIE 9.0; Windows NT 6.1; Tridentu002F5.0’u003Cbru003Eheaders = {‘User-Agent’: user_agent}u003Cbru003Ereq = urllib2.Request(url, headers = headers)u003Cbru003Eresponse = urllib2.urlopen(req)u003Cbru003Ehtml = response.read() print html #return htmlu003Cu002Fpreu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003E那么loadPage(self, page) 中的page是我们指定去请求第几页。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E最后通过 print html打印到屏幕上。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E然后我们写一个main函数见到测试一个loadPage方法u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E2. 写main函数测试一个loadPage方法u003Cu002Fpu003Eu003Cpreu003Eif __name__ == ‘__main__’: “””u003Cbru003E======================u003Cbru003E内涵段子小爬虫u003Cbru003E======================u003Cbru003E”””u003Cbru003Eprint ‘请按下回车开始’u003Cbru003Eraw_input() #定义一个Spider对象u003Cbru003EmySpider = Spider()u003Cbru003EmySpider.loadpage(1)u003Cu002Fpreu003Eu003Cpu003E程序正常执行的话,我们会在屏幕上打印了内涵段子第一页的全部html代码。 但是我们发现,html中的中文部分显示的可能是乱码 。如图所示:u003Cu002Fpu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002F46de000076f12320624b” img_width=”778″ img_height=”380″ alt=”Python爬虫实战教程,教你爬 内涵段子站,有源码” inline=”0″u003Eu003Cu002Fpu003Eu003Cpu003E那么我们需要简单的将得到的网页源代码处理一下:u003Cu002Fpu003Eu003Cpreu003Edef loadPage(self, page):u003Cbru003E”””u003Cbru003E@brief 定义一个url请求网页的方法u003Cbru003E@param page 需要请求的第几页u003Cbru003E@returns 返回的页面htmlu003Cbru003E”””u003Cbru003Eurl = “http:u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_” + str(page) + “.html”u003Cbru003E#User-Agent头u003Cbru003Euser_agent = ‘Mozillau002F5.0 (compatible; MSIE 9.0; Windows NT 6.1; Tridentu002F5.0’u003Cbru003Eheaders = {‘User-Agent’: user_agent}u003Cbru003Ereq = urllib2.Request(url, headers = headers)u003Cbru003Eresponse = urllib2.urlopen(req)u003Cbru003Ehtml = response.read()u003Cbru003Egbk_html = html.decode(‘gbk’).encode(‘utf-8’) # print gbk_htmlu003Cbru003Ereturn gbk_htmlu003Cu002Fpreu003Eu003Cpu003E注意 :对于每个网站对中文的编码各自不同,所以html.decode(‘gbk’)的写法并不是通用写法,根据网站的编码而异u003Cu002Fpu003Eu003Cpu003E这样我们再次执行以下duanzi_spider.py ,会发现之前的中文乱码可以正常显示了。u003Cu002Fpu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002F46df00005218280a09a9″ img_width=”778″ img_height=”266″ alt=”Python爬虫实战教程,教你爬 内涵段子站,有源码” inline=”0″u003Eu003Cu002Fpu003Eu003Cpu003E第二步:筛选数据u003Cu002Fpu003Eu003Cpu003E接下来我们已经得到了整个页面的数据。 但是,很多内容我们并不关心,所以下一步我们需要进行筛选。 如何筛选,就用到了上一节讲述的正则表达式。u003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003E首先u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpreu003Eimport reu003Cu002Fpreu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003E然后, 在我们得到的u003Cu002Fpu003Eu003Cpu003Egbk_htmlu003Cu002Fpu003Eu003Cpu003E中进行筛选匹配。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E我们需要一个匹配规则:u003Cu002Fpu003Eu003Cpu003E我们可以打开内涵段子的网页,鼠标点击右键 “ 查看源代码 ” 你会惊奇的发现,我们需要的每个段子的内容都是在一个u003Cu002Fpu003Eu003Cpu003E<div>u003Cu002Fpu003Eu003Cpu003E标签中,而且每个u003Cu002Fpu003Eu003Cpu003Edivu003Cu002Fpu003Eu003Cpu003E都有一个属性u003Cu002Fpu003Eu003Cpu003Eclass = “f18 mb20″u003Cu002Fpu003Eu003Cpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002F46dd000089e3578b9d25″ img_width=”808″ img_height=”506″ alt=”Python爬虫实战教程,教你爬 内涵段子站,有源码” inline=”0″u003Eu003Cu002Fpu003Eu003Cpu003E所以,我们只需要匹配到网页中所有<div class=”f18 mb20″> 到 <u002Fdiv> 的数据就可以了。u003Cu002Fpu003Eu003Cpu003E根据正则表达式,我们可以推算出一个公式是:u003Cu002Fpu003Eu003Cpu003Eu003Ccodeu003E<div.*?class=”f18 mb20″>(.*?)<u002Fdiv>u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cul class=” list-paddingleft-2″u003Eu003Cliu003Eu003Cpu003E这个表达式实际上就是匹配到所有div中class=”f18 mb20 里面的内容(具体可以看前面正则介绍)然后将这个正则应用到代码中,我们会得到以下代码:u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpreu003Edef loadPage(self, page):u003Cbru003E”””u003Cbru003E@brief 定义一个url请求网页的方法u003Cbru003E@param page 需要请求的第几页u003Cbru003E@returns 返回的页面htmlu003Cbru003E”””u003Cbru003Eurl = “http:u002Fu002Fwww.neihan8.comu002Farticleu002Flist_5_” + str(page) + “.html”u003Cbru003E#User-Agent头u003Cbru003Euser_agent = ‘Mozillau002F5.0 (compatible; MSIE 9.0; Windows NT 6.1; Tridentu002F5.0’u003Cbru003Eheaders = {‘User-Agent’: user_agent}u003Cbru003Ereq = urllib2.Request(url, headers = headers)u003Cbru003Eresponse = urllib2.urlopen(req)u003Cbru003Ehtml = response.read()u003Cbru003Egbk_html = html.decode(‘gbk’).encode(‘utf-8′) #找到所有的段子内容<div class = “f18 mb20″><u002Fdiv>u003Cbru003E#re.S 如果没有re.S 则是只匹配一行有没有符合规则的字符串,如果没有则下一行重新匹配u003Cbru003E# 如果加上re.S 则是将所有的字符串将一个整体进行匹配u003Cbru003Epattern = re.compile(r'<div.*?class=”f18 mb20”>(.*?)<u002Fdiu003Cbru003Ev>’, re.S)u003Cbru003Eitem_list = pattern.findall(gbk_html) return item_listdef printOnePage(self, item_list, page): “””u003Cbru003E@brief 处理得到的段子列表u003Cbru003E@param item_list 得到的段子列表u003Cbru003E@param page 处理第几页u003Cbru003E”””u003Cbru003Eprint “******* 第 %d 页 爬取完毕…*******” %page for item in item_list: print “================”u003Cbru003Eprint iteu003Cu002Fpreu003Eu003Cpu003E这里需要注意一个是re.S是正则表达式中匹配的一个参数。u003Cu002Fpu003Eu003Cpu003E如果 没有re.S 则是 只匹配一行 有没有符合规则的字符串,如果没有则下一行重新匹配。u003Cu002Fpu003Eu003Cpu003E如果 加上re.S 则是将 所有的字符串 将一个整体进行匹配,findall 将所有匹配到的结果封装到一个list中。u003Cu002Fpu003Eu003Cpu003E然后我们写了一个遍历item_list的一个方法 printOnePage() 。 ok程序写到这,我们再一次执行一下。u003Cu002Fpu003Eu003Cpreu003EPower@PowerMac ~$ python duanzi_spider.pyu003Cu002Fpreu003Eu003Cpu003E我们第一页的全部段子,不包含其他信息全部的打印了出来。u003Cu002Fpu003Eu003Cpu003E你会发现段子中有很多 <p> , <u002Fp> 很是不舒服,实际上这个是html的一种段落的标签。u003Cu002Fpu003Eu003Cpu003E在浏览器上看不出来,但是如果按照文本打印会有<p>出现,那么我们只需要把我们不希望的内容去掉即可了。u003Cu002Fpu003Eu003Cpu003E我们可以如下简单修改一下 printOnePage().u003Cu002Fpu003Eu003Cpreu003Edef printOnePage(self, item_list, page):u003Cbru003E”””u003Cbru003E@brief 处理得到的段子列表u003Cbru003E@param item_list 得到的段子列表u003Cbru003E@param page 处理第几页u003Cbru003E”””u003Cbru003Eprint “******* 第 %d 页 爬取完毕…*******” %page for item in item_list: print “================”u003Cbru003Eitem = item.replace(“<p>”, “”).replace(“<u002Fp>”, “”).replu003Cbru003Eace(“<br u002F>”, “”) print itemu003Cu002Fpreu003Eu003Cpu003E第三步:保存数据u003Cu002Fpu003Eu003Cpu003E我们可以将所有的段子存放在文件中。比如,我们可以将得到的每个item不是打印出来,而是存放在一个叫 duanzi.txt 的文件中也可以。u003Cu002Fpu003Eu003Cpreu003Edef writeToFile(self, text):”’u003Cbru003E@brief 将数据追加写进文件中u003Cbru003E@param text 文件内容u003Cbru003E”’u003Cbru003EmyFile = open(“.u002Fduanzi.txt”, ‘a’) #追加形式打开文件u003Cbru003EmyFile.write(text)u003Cbru003EmyFile.write(“———————————–“)u003Cbru003EmyFile.close()u003Cu002Fpreu003Eu003Cpu003E然后我们将print的语句 改成writeToFile() ,当前页面的所有段子就存在了本地的MyStory.txt文件中。u003Cu002Fpu003Eu003Cpreu003Edef printOnePage(self, item_list, page):”’u003Cbru003E@brief 处理得到的段子列表u003Cbru003E@param item_list 得到的段子列表u003Cbru003E@param page 处理第几页u003Cbru003E”’u003Cbru003Eprint “******* 第 %d 页 爬取完毕…*******” %page for item in item_list: # print “================”u003Cbru003Eitem = item.replace(“<p>”, “”).replace(“<u002Fp>”, “”).replace(“<br u002F>”, “”) # print itemu003Cbru003Eself.writeToFile(item)u003Cu002Fpreu003Eu003Cpu003E第四步:显示数据u003Cu002Fpu003Eu003Cpu003E接下来我们就通过参数的传递对page进行叠加来遍历 内涵段子吧的全部段子内容。u003Cu002Fpu003Eu003Cpu003E只需要在外层加一些逻辑处理即可。u003Cu002Fpu003Eu003Cpreu003Edef doWork(self):”’u003Cbru003E让爬虫开始工作u003Cbru003E”’u003Cbru003Ewhile self.enable: try:u003Cbru003Eitem_list = self.loadPage(self.page) except urllib2.URLError, e: print e.reason continueu003Cbru003E#对得到的段子item_list处理u003Cbru003Eself.printOnePage(item_list, self.page)u003Cbru003Eself.page += 1 #此页处理完毕,处理下一页u003Cbru003Eprint “按回车继续…”u003Cbru003Eprint “输入 quit 退出”u003Cbru003Ecommand = raw_input() if (command == “quit”):u003Cbru003Eself.enable = Falseu003Cbru003Ebreaku003Cu002Fpreu003Eu003Cpu003E最后,我们执行我们的代码,完成后查看当前路径下的duanzi.txt文件,里面已经有了我们要的内涵段子。u003Cu002Fpu003Eu003Cpu003E以上便是一个非常精简使用的小爬虫程序,使用起来很是方便,如果想要爬取其他网站的信息,只需要修改其中某些参数和一些细节就行了。u003Cu002Fpu003Eu003Cu002Fdivu003E”

原文始发于:Python爬虫实战教程,教你爬 内涵段子站,有源码

主题测试文章,只做测试使用。发布者:醒百年,转转请注明出处:http://www.cxybcw.com/27226.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code