对网易新闻排行榜的抓取,是我以前学爬虫做的一个小实验。像下图,我的目的就是想把网易新闻排行榜这个页面下的所有新闻的标题和对应的链接都下载下来,分专题保存。
抓取页面很容易,但是有一点,在页面分析的时候,我发现并不是所有专题的页面结构是一样的。用正则表达式分析的话,速度确实慢了点,这时候就要讲究不同解析规则的相互配合。而正则表达式,对于获取多种组合数据有一定的可取之处。
话不多说,上个简单的代码,同时我把python代码打包成exe可执行文件。代码和exe文件可以在NewsSpider下载。对于没有python环境的情况下,直接双击exe文件就可以开始抓取。这样子,我们就可以在上班的时候大模大样的看文档的姿态来筛选感兴趣的新闻,而不被领导发现喽。。
# -*- coding: utf-8 -*- import os import sys import urllib2 import requests import re from lxml import etree def StringListSave(save_path, filename, slist): if not os.path.exists(save_path): os.makedirs(save_path) path = save_path+"/"+filename+".txt" with open(path, "w+") as fp: for s in slist: fp.write("%s\t\t%s\n" % (s[0].encode("utf8"), s[1].encode("utf8"))) def Page_Info(myPage): '''Regex''' mypage_Info = re.findall(r'<div class="titleBar" id=".*?"><h2>(.*?)</h2><div class="more"><a href="(.*?)">.*?</a></div></div>', myPage, re.S) return mypage_Info def New_Page_Info(new_page): '''Regex(slowly) or Xpath(fast)''' # new_page_Info = re.findall(r'<td class=".*?">.*?<a href="(.*?)\.html".*?>(.*?)</a></td>', new_page, re.S) # # new_page_Info = re.findall(r'<td class=".*?">.*?<a href="(.*?)">(.*?)</a></td>', new_page, re.S) # bugs # results = [] # for url, item in new_page_Info: # results.append((item, url+".html")) # return results dom = etree.HTML(new_page) new_items = dom.xpath('//tr/td/a/text()') new_urls = dom.xpath('//tr/td/a/@href') assert(len(new_items) == len(new_urls)) return zip(new_items, new_urls) def Spider(url): i = 0 print "downloading ", url myPage = requests.get(url).content.decode("gbk") # myPage = urllib2.urlopen(url).read().decode("gbk") myPageResults = Page_Info(myPage) save_path = u"网易新闻抓取" filename = str(i)+"_"+u"新闻排行榜" StringListSave(save_path, filename, myPageResults) i += 1 for item, url in myPageResults: print "downloading ", url new_page = requests.get(url).content.decode("gbk") # new_page = urllib2.urlopen(url).read().decode("gbk") newPageResults = New_Page_Info(new_page) filename = str(i)+"_"+item StringListSave(save_path, filename, newPageResults) i += 1 if __name__ == '__main__': print "start" start_url = "http://news.163.com/rank/" Spider(start_url) print "end"
转载请注明:宁哥的小站 » 网易新闻排行榜抓取回顾