网页爬虫抓取百度图片(一下如何使用python编写一个简单的网络爬虫?(组图))
优采云 发布时间: 2021-12-22 14:02网页爬虫抓取百度图片(一下如何使用python编写一个简单的网络爬虫?(组图))
嗯……今天分享一下如何用python写一个简单的网络爬虫。说起爬虫,这简直就是懒人程序员和宅男的福音。写完就可以爬取你想要的任何资源,大到各种学习资源、论文和资料,小到各种图片和视频(...)等等...嗯...讲解完如何搭建一个简单的爬虫框架,会根据框架写一个栗子。栗子代码会从python百科页面开始爬取各种百科页面信息并记录下来。
请注意,这里的标题是“*Lightweight Crawler*”。之所以说它是轻量级的,是因为它只涉及静态网页的分析。至于AJAX异步加载,不涉及JS脚本。
先来个代码链接~~~
Python爬虫内存版
Python爬虫MySQL版
哦对了,这个爬虫有两个版本,一个是MySQL版本,一个是内存板。有什么不同?前者使用 MySQL 数据库来存储访问过的 URL,而后者使用内存。前者的优点是多次运行相互独立,不会重复爬取同一个URL,而后者则不同。每次运行都会从同一个网址开始,重复抓取同一个网址,因为前者是持久化存储,而后者不是。一旦后一个程序关闭,所有访问过的 URL 记录将被清除。不过前者也有一个缺点,就是运行速度比较慢……具体怎么样,大家可以下载代码运行一下。以下是内存存储版~~~
1. python爬虫框架
在写代码之前,首先要确定一个好的代码框架,这也是一个好程序员的习惯(咳咳……我不是一个好程序员……我以后会……)。在这里,我将描述一个简单的爬虫框架。
一个基本的爬虫应该由以下4部分组成:URL调度器、网页下载器、网页解析器、爬取信息输出器。以下是他们协调工作的流程图。
假设这四个功能块都是按照上图的命名方式命名的,那么根据上面的流程图,我们可以编写主爬虫程序如下(为了测试方便,下面的代码限制了爬取的URL数量为10个) :
# 爬虫主程序class SpiderMain(object):def __init__(self):self.url_manager=UrlManager()self.downloader=HtmlDownloader()self.parser=HtmlParser()self.outputer=HtmlOutputer()def craw(self, url):num=0self.url_manager.add_new_url(url)while self.url_manager.has_new_url() and num < 10:url = self.url_manager.get_new_url() print url# 下载网页内容content=self.downloader.download(url)if content is None:print "Craw failed"continue#解析网页数据data = self.parser.parse(url, content)if data is None:print "Craw failed"continuenew_urls = data[0]new_data = data[1]# 收集解析后爬取的数据self.url_manager.add_new_urls(new_urls)self.outputer.collect(new_data)num+=1self.outputer.output()
1) URL 调度器
URL调度器负责对URL进行处理,主要将未访问过的URL提供给网页下载器进行访问下载,屏蔽已访问过的URL,防止程序爬取同一个页面,提高效率。它不断向网页下载器提供新 URL,然后阻止它们,依此类推,直到没有新 URL 或达到爬网次数限制。假设URL调度器是一个类UrlManager,那么我们可以编写如下代码:
# URL调度器class UrlManager(object):def __init__(self):self.new_url=set()self.old_url=set()def add_new_url(self,url):if url not in self.new_url and url not in self.old_url:self.new_url.add(url)def add_new_urls(self,urls):if urls is None or len(urls) == 0:returnfor url in urls:self.add_new_url(url)def has_new_url(self):return len(self.new_url)!=0def get_new_url(self):url = self.new_url.pop()self.old_url.add(url)return url
简单分析一下,UrlManager提供了两个接口,让主程序可以添加一个或多个新的URL,也可以从中获取需要访问的URL。一旦获取到一个 URL,UrlManager 会在 old_url 集合中添加 URL 以阻止它。2) 网络下载器
这个很简单,我们可以通过urllib2提供的接口获取指定URL的内容。代码显示如下:
# 下载网页内容class HtmlDownloader(object):def download(self,url):if url is None:return Nonetry:response = urllib2.urlopen(url)except urllib2.URLError:return Noneexcept urllib2.HTTPError:return Noneif response.getcode() != 200:return Nonereturn response.read()
这里只需要注意使用try-except处理异常,防止程序崩溃即可。3) 网页解析器
我们使用 BeautifulSoap 来解析网页。BeautifulSoup 是第三方 Python 库,专门用于解析网页和获取 DOM 树。下面简单说一下如何使用BeautifulSoap解析网页。我们用百度百科作为栗子。
首先,我们打开此页面并右键单击以查看元素。我们先来看看标题的html代码。
我们可以看到标题Python的html代码是
...Python...
基于这些标签,我们可以使用 BeautifulSoap 来定位标题。下*敏*感*词*体怎么写。
BeautifulSoap 提供了 find 和 find_all 方法来查找一个或多个指定的节点。以上面的标题为栗子,我们就可以写出python代码如下。
soup = BeautifulSoup(content,'html.parser',from_encoding='utf-8')title = soup.find('dd',class_='lemmaWgt-lemmaTitle-title') if title !=None: title = title.find('h1') if title != None: data['title'] = title.get_text() else: data['title'] = ''
BeautifulSoap通过指定标签名称和标签属性内容,从一个html文档中定位符合要求的标签,并获取其属性和内容。BeautifulSoap的详细使用可以百度~~~这里就不赘述了~~~
这里,我们的任务是从一个html页面中获取一个新的百度百科链接,并获取页面的标题内容和摘要。网页解析器的代码如下:
# 分析网页数据
4) 爬取内容的输出设备
这个也比较简单,主要是存储爬取到的数据,然后写入文件。
# 收集爬取到的数据以及将数据输出到文件中class HtmlOutputer(object):def __init__(self):self.datas = []def collect(self,data):self.datas.append(data)def output(self):with open('output.html','wb') as f:f.write('')f.write('')f.write('')f.write('')try:for data in self.datas:f.write('')f.write('%s' % data['url'].encode('utf-8'))f.write('%s' % data['title'].encode('utf-8'))f.write('%s' % data['summary'].encode('utf-8'))f.write('')except Exception as e:print efinally:f.write('')f.write('')f.write('')f.close()
上面的代码提供了一个collect方法来存储爬虫爬取的数据,然后还提供了一个output方法将保存在内存中的数据输出到一个html文件中,并以表格的形式呈现。2. 爬虫运行效果
嗯... 以上就是一个简单爬虫的简单分析。谢谢~
20