爬虫应用——寻找乔丹相关10条URL

2024-03-27 22:38

本文主要是介绍爬虫应用——寻找乔丹相关10条URL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

直接百度乔丹的URL是这样的:
root-url:

http://baike.baidu.com/link?url=Htp0lISd4ld46oenEs4HvYh13u8iTht9YxBpUY8e3QECSsxXYQRg_yr7R_wvRos3kWflwekkcn_5VuZsgEhFPY_oQAKj8xla3F6MXbCoDnirERpJEyVuHZ3uGGvpmfwVz_rsdygPH5wirnODhhSv2_

恩,的确非常恶心。我们需要寻找一个root-url,但是这样恶心的URL确实不能正常工作。
然后我用了一个笨办法,直接百度科比,然后找到乔丹的链接,查看元素并作为HTML编辑,OK,本尊出现:

http://baike.baidu.com/view/19096.htm

有了它后,就可以进行分析和编码了。
从之前的学习记录看,我们至少需要调度器spider_man,URL管理器url_manager,HTML解析器html_parser,HTML下载器html_downloader
计划输出结果保存成一个文件,所以,我们的文件结构是:

  • spider_man.py
  • url_manager.py
  • html_downloader.py
  • html_parser.py
  • outputer.py

查看网页上其他链接的格式,右击——查看元素——作为HTML编辑:

<a target="_blank" href="/view/32594.htm">芝加哥公牛队</a>

学习了BeautifulSoup官网上相关的筛选语法后,为了精确的定位我们想要的信息,可以这样:

new_urls=set()#<a target="_blank" href="/view/32594.htm">芝加哥公牛队</a>links=soup.find_all('a',href=re.compile(r"/view/\d+\.htm"))   #正则匹配
links=soup.find_all(target="_blank")

编码部分:
html_downloader.py:

#coding:utf8
import urllib2class HtmlDownloader(object):def download(self,url):if url is None:return Noneresponse = urllib2.urlopen(url)if response.getcode()!=200:return None#print response.read()return response.read()

outputer.py:

#coding:utf8class HtmlOutputer(object):def __init__(self):self.datas=[]def collect_data(self,data):if data is None:returnself.datas.append(data)def output_html(self):fout=open('output.html','w')fout.write('<html>')fout.write('<body>')fout.write('<table border="1px solid #000">')for data in self.datas:fout.write('<tr>')fout.write('<td>%s</td>' %data['url'])fout.write('<td>%s</td>' %data['title'].encode('utf-8'))fout.write('</tr>')fout.write('</table>')fout.write('</body>')fout.write('</html>')fout.close()

html_parser.py:

#coding:utf8
from bs4 import BeautifulSoup
import re
import urlparseclass HtmlParser(object):def _get_new_urls(self,page_url,soup):new_urls=set()#<a target="_blank" href="/view/32594.htm">芝加哥公牛队</a>links=soup.find_all('a',href=re.compile(r"/view/\d+\.htm"))   #正则匹配links=soup.find_all(target="_blank")for link in links:new_url=link['href']new_full_url=urlparse.urljoin(page_url,new_url)new_urls.add(new_full_url)#print new_urlsreturn new_urlsdef _get_new_data(self,page_url,soup):res_data={}res_data['url']=page_url#<dd class="lemmaWgt-lemmaTitle-title">#<h1>迈克尔·乔丹</h1>title_node=soup.find('dd',class_="lemmaWgt-lemmaTitle-title").find("h1")res_data['title']=title_node.get_text()return res_data        def parse(self,page_url,html_cont):if page_url is None or html_cont is None:returnsoup=BeautifulSoup(html_cont,'html.parser',from_encoding='utf-8')#print soupnew_urls=self._get_new_urls(page_url,soup)print new_urlsnew_data=self._get_new_data(page_url,soup)return new_urls,new_data

url_manager.py:

#coding:utf8class UrlManager(object):def __init__(self):self.new_urls=set()self.old_urls=set()def add_new_url(self,url):if url is None:returnif 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:returnfor url in urls :self.add_new_url(url)def has_new_url(self):return len(self.new_urls)!=0def get_new_url(self):new_url=self.new_urls.pop()self.old_urls.add(new_url)return new_url

spider_man.py:

#coding: utf8
import url_manager,html_downloader,html_outputer,html_parserclass SpiderMain(object):"""docstring for SpiderMain"""def __init__(self):self.urls=url_manager.UrlManager()self.downloader=html_downloader.HtmlDownloader()self.parser=html_parser.HtmlParser()self.outputer=html_outputer.HtmlOutputer()def craw(self,root_url):count=1   #爬取第几个URLself.urls.add_new_url(root_url)while self.urls.has_new_url():try:new_url=self.urls.get_new_url()print 'NO.%d: %s' % (count,new_url)html_cont=self.downloader.download(new_url)# 解析得到URL和数据new_urls, new_data=self.parser.parse(new_url,html_cont)print new_urls#print new_dataself.urls.add_new_urls(new_urls)self.outputer.collect_data(new_data)if count==20:breakcount=count+1except Exception, e:print e#print countself.outputer.output_html()if __name__ == "__main__":root_url="http://baike.baidu.com/view/19096.htm"obj_spider=SpiderMain()obj_spider.craw(root_url);

获得结果:



http://baike.baidu.com/view/19096.htm迈克尔·乔丹
http://baike.baidu.com/view/1091423.htm杰里·斯隆
http://baike.baidu.com/view/62675.htm卡尔·马龙
http://baike.baidu.com/view/571202.htm公国
http://baike.baidu.com/subview/4466937/15093391.htm赛季
http://baike.baidu.com/view/582.htmNBA
http://baike.baidu.com/view/1795775.htm篮圈
http://baike.baidu.com/view/1124818.htm迈克尔·里德
http://baike.baidu.com/view/36806.htm蒂姆·邓肯
http://baike.baidu.com/view/1140.htmNBA季前赛

这篇关于爬虫应用——寻找乔丹相关10条URL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853625

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.