python简易爬虫

这两天看了一下python的基础语法,跟着网上的教程爬了一下百度百科和python相关联的词条。采用了beautifulsoup4插件

下面是流程

首先是一个url管理器,负责增加/获取/判断是否有url

 1 # coding:UTF8
 2 #url管理器
 3 class UrlManager(object):
 4     def __init__(self):
 5         self.new_urls=set()
 6         self.old_urls=set()
 7
 8     def add_new_url(self,url):
 9         if url is None:
10             return
11
12         if url not in self.new_urls and url not in self.old_urls:
13             self.new_urls.add(url)
14
15     def add_new_urls(self,urls):
16         if urls is None or len(urls)==0:
17             return
18
19         for url in urls:
20             self.add_new_url(url)
21
22     def has_new_url(self):
23         return len(self.new_urls)!=0
24
25
26     def get_new_url(self):
27         new_url=self.new_urls.pop()
28         self.old_urls.add(new_url)
29         return new_url

url_manager.py

然后是一个网页下载器,实现网页的下载

 1 import urllib2
 2
 3 class HtmlDownloader(object):
 4
 5
 6     def download(self, url):
 7         if url is None:
 8             return None
 9
10         #下载网页
11         response = urllib2.urlopen(url)
12
13         #如果状态不为200 即失败,返回空
14         if response.getcode() != 200:
15             return None
16
17         #以字符串形式返回网页
18         return response.read()

html_downloader.py

然后是网页解析器,实现获取网页中的url和内容的保存

 1 from bs4 import BeautifulSoup
 2 import re
 3 import urlparse
 4
 5
 6 class HtmlParser(object):
 7
 8
 9     def _get_new_url(self, page_url, soup):
10         new_urls=set()
11         # /view/123.htm
12         links=soup.find_all(‘a‘,href=re.compile(r"/view/\d+\.htm"))
13         for link in links:
14             new_url=link[‘href‘]
15             new_full_url=urlparse.urljoin(page_url,new_url)
16             new_urls.add(new_full_url)
17
18         return new_urls
19
20     def _get_new_data(self, page_url, soup):
21         res_data={}
22
23         #url
24         res_data[‘url‘]=page_url
25
26         #<dd class="lemmaWgt-lemmaTitle-title"> <h1>Python</h1>
27         title_node=soup.find(‘dd‘,class_="lemmaWgt-lemmaTitle-title").find("h1")
28         res_data[‘title‘]=title_node.get_text()
29
30         # <div class="lemma-summary">
31         summary_node=soup.find(‘div‘,class_="lemma-summary")
32         res_data[‘summary‘]=summary_node.get_text()
33
34         return res_data
35
36     def parse(self,page_url,html_cont):
37         if page_url is None or html_cont is None:
38             return
39
40         soup =BeautifulSoup(html_cont,‘html.parser‘,from_encoding=‘utf-8‘)
41         new_urls=self._get_new_url(page_url,soup)
42         new_data=self._get_new_data(page_url,soup)
43         return new_urls,new_data

html_parser.py

然后是网页内容输出,将我们需要的内容保存下来

 1 class HtmlOutputer(object):
 2     def __init__(self):
 3         self.datas=[]
 4
 5     def collect_data(self,data):
 6         if data is None:
 7             return
 8         self.datas.append(data)
 9
10
11     def output_html(self):
12         fout=open(‘output.html‘,‘w‘)
13
14         fout.write("<html>")
15         fout.write("<body>")
16         fout.write("<table>")
17
18         #ascii
19         for data in self.datas:
20             fout.write("<tr>")
21             fout.write("<tr>%s</td>" % data[‘url‘])
22             fout.write("<tr>%s</td>" % data[‘title‘].encode(‘utf-8‘))
23             fout.write("<tr>%s</td>" % data[‘summary‘].encode(‘utf-8‘))
24             fout.write("/tr")
25
26         fout.write("</html>")
27         fout.write("</body>")
28         fout.write("</table>")
29
30         fout.close()

html_outputer

最后是主函数的调用,注释还算明白

 1 # coding:UTF8
 2 # 以入口url为参数爬取相关页面
 3 from baike_spider import url_manager, html_downloader, html_parser, html_outputer
 4
 5
 6 class SpiderMain(object):
 7     #构造函数声明url管理器,网页下载器,网页解析器,网页输入器
 8     def __init__(self):
 9         self.urls = url_manager.UrlManager()
10         self.downloader = html_downloader.HtmlDownloader()
11         self.parser = html_parser.HtmlParser()
12         self.outputer = html_outputer.HtmlOutputer()
13
14     def craw(self, root_url):
15         #记录爬取的网页数
16         count = 1
17
18         #把入口url传入
19         self.urls.add_new_url(root_url)
20         #当new_urls里面还有元素时
21         while self.urls.has_new_url():
22             try:
23                 #获取一个新的url
24                 new_url = self.urls.get_new_url()
25                 print ‘craw %d:%s‘ % (count, new_url)
26
27                 #接收网页的内容
28                 html_cont = self.downloader.download(new_url)
29
30                 #获取新的url 和需要的网页上的内容
31                 new_urls, new_data = self.parser.parse(new_url, html_cont)
32                 self.urls.add_new_urls(new_urls)
33
34                 #拼接数据字符串
35                 self.outputer.collect_data(new_data)
36
37                 if count == 1000:
38                     break
39
40                 count = count + 1
41
42             except:
43                 print ‘craw failed‘
44
45                 #向output.html写入数据
46                 self.outputer.output_html()
47
48 if __name__ == "__main__":
49     root_url = "http://baike.baidu.com/view/21087.htm"
50     obj_spider = SpiderMain()
51     obj_spider.craw(root_url)

spider_main.py

然后是输出结果的截图

另外网页的信息保存到了output.html文件中

时间: 2024-08-10 02:02:40

python简易爬虫的相关文章

python简易爬虫实现

目的:爬取昵称 目标网站:糗事百科 依赖的库文件:request.sys.beautifulSoup4.imp.io Python使用版本:3.4 说明:参考http://cn.python-requests.org/zh_CN/latest/user/quickstart.html 步骤: 一.熟悉request Request介绍: Request库是一个python http库,其内部依赖urllib3库. 以下是它的功能特性: 国际化域名和 URL.Keep-Alive & 连接池.带持

Python简易爬虫爬取百度贴吧图片

通过python 来实现这样一个简单的爬虫功能,把我们想要的图片爬取到本地.(Python版本为3.6.0) 一.获取整个页面数据 def getHtml(url): page=urllib.request.urlopen(url) html=page.read() return html 说明: 向getHtml()函数传递一个网址,就可以把整个页面下载下来. urllib.request 模块提供了读取web页面数据的接口,我们可以像读取本地文件一样读取www和ftp上的数据. 二.筛选页面

Python简易爬虫以及嵌套数据类型

一:起因 (0)爬虫就是网络蜘蛛,爬取指定URL的html网页的内容,所以会需要urllib2包,字符串string的操作肯定也是需要的,以及字符串匹配包re. (1)Python的嵌套类型,一般在基础教程里面很少涉及到的:Python的更高级应用肯定会涉及的,只是个人能力有限,如今没有深入,期待不就将来接触学习一下. (2)说起嵌套类型,这要从Java 或则 c++的嵌套类型说起,只要你处理数据,增删该查一般都会涉及到嵌套类型,原来的语言中涉及到,自然而然的想到了Python肯定也可以应用嵌套

利用简易爬虫完成一道基础CTF题

利用简易爬虫完成一道基础CTF题 声明:本文主要写给新手,侧重于表现使用爬虫爬取页面并提交数据的大致过程,所以没有对一些东西解释的很详细,比如表单,post,get方法,感兴趣的可以私信或评论给我.如果文中有哪些问题,也欢迎大家指正. Written by Menglin Ma 写在前面 ??如果有想学习基础爬虫的同学,建议在中国大学MOOC上搜索嵩天老师的爬虫课程,讲的真的很细致,也很基础. ??想入门CTF的同学,给你们推荐个基础的网站,上面的好多题对新手比较友好:www.shiyanbar

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的mapping映射管理

第三百六十四节,Python分布式爬虫打造搜索引擎Scrapy精讲-elasticsearch(搜索引擎)的mapping映射管理 1.映射(mapping)介绍 映射:创建索引的时候,可以预先定义字段的类型以及相关属性elasticsearch会根据json源数据的基础类型猜测你想要的字段映射,将输入的数据转换成可搜索的索引项,mapping就是我们自己定义的字段数据类型,同时告诉elasticsearch如何索引数据以及是否可以被搜索 作用:会让索引建立的更加细致和完善 类型:静态映射和动态

Python网络爬虫

http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的. 从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址, 然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止. 如果把整个互联网当成一个网站,那么

Python开源爬虫框架scrapy的了解与认识

很多学习Python编程语言的朋友都会学习Python网络爬虫技术,也有专门学习网络爬虫技术的,那么如何学习Python爬虫技术呢,今天就给大家讲讲使用Python抓取数据时非常受欢迎的Python抓取框架scrapy,下面一起学习下Scrapy的架构,便于更好的使用这个工具. 一.概述 下图显示了Scrapy的大体架构,其中包含了它的主要组件及系统的数据处理流程(绿色箭头所示).下面就来一个个解释每个组件的作用及数据的处理过程. 二.组件 1.Scrapy Engine(Scrapy引擎) S

python网络爬虫之cookie的使用方法汇总

在编写python网络爬虫时,除了要考虑到爬虫的异常处理问题,我们是否还会考虑到cookie的使用呢?在使用cookie时,有想过为什么要使用cookie吗?一起来看看吧. Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密)比如说有些网站需要登录后才能访问某个页面,在登录之前,你想抓取某个页面内容是不允许的.那么我们可以利用Urllib2库保存我们登录的Cookie,然后再抓取其他页面就达到目的了. 在此之前呢,我们必须先介绍一个open

Python天气预报采集器 python网页爬虫

这个天气预报采集是从中国天气网提取广东省内主要城市的天气并回显.本来是打算采集腾讯天气的,但是貌似它的数据是用js写上去还是什么的,得到的html文本中不包含数据,所以就算了 爬虫简单说来包括两个步骤:获得网页文本.过滤得到数据. 1.获得html文本.  python在获取html方面十分方便,寥寥数行代码就可以实现需要的功能. def getHtml(url): page = urllib.urlopen(url) html = page.read() page.close() return