爬虫应用——寻找乔丹相关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

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

JavaScript Array.from及其相关用法详解(示例演示)

《JavaScriptArray.from及其相关用法详解(示例演示)》Array.from方法是ES6引入的一个静态方法,用于从类数组对象或可迭代对象创建一个新的数组实例,本文将详细介绍Array... 目录一、Array.from 方法概述1. 方法介绍2. 示例演示二、结合实际场景的使用1. 初始化二

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2