网页爬虫抓取百度图片(一下如何使用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,&#39;html.parser&#39;,from_encoding=&#39;utf-8&#39;)title = soup.find(&#39;dd&#39;,class_=&#39;lemmaWgt-lemmaTitle-title&#39;)        if title !=None:            title = title.find(&#39;h1&#39;)        if title != None:            data[&#39;title&#39;] = title.get_text()        else:            data[&#39;title&#39;] = &#39;&#39;

  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(&#39;output.html&#39;,&#39;wb&#39;) as f:f.write(&#39;&#39;)f.write(&#39;&#39;)f.write(&#39;&#39;)f.write(&#39;&#39;)try:for data in self.datas:f.write(&#39;&#39;)f.write(&#39;%s&#39; % data[&#39;url&#39;].encode(&#39;utf-8&#39;))f.write(&#39;%s&#39; % data[&#39;title&#39;].encode(&#39;utf-8&#39;))f.write(&#39;%s&#39; % data[&#39;summary&#39;].encode(&#39;utf-8&#39;))f.write(&#39;&#39;)except Exception as e:print efinally:f.write(&#39;&#39;)f.write(&#39;&#39;)f.write(&#39;&#39;)f.close()

  上面的代码提供了一个collect方法来存储爬虫爬取的数据,然后还提供了一个output方法将保存在内存中的数据输出到一个html文件中,并以表格的形式呈现。2. 爬虫运行效果

  

  

  嗯... 以上就是一个简单爬虫的简单分析。谢谢~

  20

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线