静态页面的抓取(学习简单爬虫)
2015-12-25 18:36
337 查看
圣诞节快乐(づ ̄ 3 ̄)づ~~~
在这个半放假的日子里,人也变得慵懒起来,在MOOC下学习了静态页面的简单爬虫(传送门:http://www.imooc.com/learn/563),干货满满啊~~
所以爬了一个芈月传么么哒~~~
有些小的细节没有做好,所以在调试上费了不少的功夫,还是太粗心了T^T
需要说明的一点是,跟着老师的代码,当写入到output.html中出现了乱码,但是写到output.txt中不会有问题。查了一下是因为html页面如果是中文也需要进行编码的说明,因此在原来代码基础上增加了
开心地去看芈月传啦~~~~
在这个半放假的日子里,人也变得慵懒起来,在MOOC下学习了静态页面的简单爬虫(传送门:http://www.imooc.com/learn/563),干货满满啊~~
所以爬了一个芈月传么么哒~~~
# coding=utf-8 import urllib2 class UrlManager(object): def __init__(self): self.new_urls=set() self.old_urls=set() def add_new_url(self,url): if url is None: return if url not in self.new_urls and url not in self.old_urls: self.new_urls.add(url) def add_new_urls(self,urls): if urls is None or len(urls)==0: return for url in urls: self.add_new_url(url) def has_new_url(self): return len(self.new_urls)!=0 def get_new_url(self): new_url=self.new_urls.pop() self.old_urls.add(new_url) return new_url class HtmlDownloader(object): def download(self,url): if url is None: return None response = urllib2.urlopen(url) if response.getcode()!=200: return None return response.read() from bs4 import BeautifulSoup import re import urlparse class HtmlParser(object): def _get_new_urls(self,page_url,soup): new_urls=set() #/view/123.htm links=soup.find_all('a',href=re.compile(r"/view/\d+\.htm")) for link in links: new_url = link['href'] new_full_url = urlparse.urljoin(page_url,new_url) new_urls.add(new_full_url) return new_urls def _get_new_data(self,page_url,soup): res_data={} res_data['url']=page_url #<dd class="lemmaWgt-lemmaTitle-title"> <h1>Python</h1> title_node = soup.find('dd',class_="lemmaWgt-lemmaTitle-title").find("h1") res_data['title']=title_node.get_text() summary_node=soup.find('div',class_="lemma-summary") res_data['summary']=summary_node.get_text() return res_data def parse(self,page_url,html_cont): if page_url is None or html_cont is None: return soup = BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8') new_urls=self._get_new_urls(page_url,soup) new_data=self._get_new_data(page_url,soup) return new_urls,new_data class HtmlOutputer(object): def __init__(self): self.datas=[] def collect_data(self,data): if data is None: return self.datas.append(data) def output_html(self): fout = open('output.html','w') fout.write("<html>") fout.write("<meta charset='UTF-8'>") fout.write("<body>") fout.write("<table>") for data in self.datas: fout.write("<tr>") #asci fout.write("<td>%s</td>"% data['url']) fout.write("<td>%s</td>"% data['title'].encode('utf-8')) print data['title'].encode('utf-8') fout.write("<td>%s</td>"% data['summary'].encode('utf-8')) fout.write("</table>") fout.write("</body>") fout.write("</html>") fout.close() class SpiderMain(object): def __init__(self): self.urls = UrlManager() self.downloader=HtmlDownloader() self.parser=HtmlParser() self.outputer=HtmlOutputer() def craw(self,root_url): count=1 self.urls.add_new_url(root_url) while self.urls.has_new_url(): try: new_url = self.urls.get_new_url() print 'craw %d : %s' %(count,new_url) html_cont = self.downloader.download(new_url) new_urls,new_data=self.parser.parse(new_url,html_cont) self.urls.add_new_urls(new_urls) self.outputer.collect_data(new_data) if count==50: break count = count +1 except: print 'craw failed' self.outputer.output_html() if __name__=="__main__": root_url="http://baike.baidu.com/subview/9975572/10764629.htm" obj_spider= SpiderMain() obj_spider.craw(root_url)
有些小的细节没有做好,所以在调试上费了不少的功夫,还是太粗心了T^T
需要说明的一点是,跟着老师的代码,当写入到output.html中出现了乱码,但是写到output.txt中不会有问题。查了一下是因为html页面如果是中文也需要进行编码的说明,因此在原来代码基础上增加了
fout.write("<meta charset='UTF-8'>")
开心地去看芈月传啦~~~~
相关文章推荐
- Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等
- Git使用
- PAT刷题
- 博客园中前辈技术总结会不会过期
- 宏定义
- Oracle V$SESSION详解
- C语言随笔
- CI控制器调用内部方法并加载对应模板的做法
- 大白话系列之C#委托与事件讲解(二)
- 实现SVN与WEB同步解决方案(转)
- 常用命令
- 是否创建数据库判断以及建表
- Android如何获得系统(system)权限
- Pyqtdeploy Complie Win32 Version PyQtWin32静态编译记录
- Python Network Programming(6)---Socket网络编程总结
- 设备驱动简介
- HTTP协议之:TCP连接详解
- 即时行乐的总结
- 将rootfs制作成ramdisk
- android加固系列—2.加固前先要学会破解,调试内存值修改程序走向