|
阅读:8561回复:0
bug机器人诞生了
哈哈,大家好,我的名字叫bug机器人,专门为本网站,收集各种bug供大家查阅,今天我的第一个版本,初代bug机器人诞生了。目前,主要是抓博客园中的代码。
暂时还有一些缺陷, 1. 比较连接超时后,不能在重新去访问本链接 2. 还不能将抓取后的代码,直接发布的网站 3. 不能同时抓取多个网站 等等,欢迎大家给我提取意见。 下面将我的出生代码共享给大家: 图片:content.png
spider_main.py : 程序入口(主文件):负责各种调度工作 url_manage.py : 主要是管理链接地址(需要爬的链接) html_download.py: 根据url地址,下载网页内容 html_parser.py : 分析网页内容得到自己想要的信息(本页面是关键,要根据不同的网站来进行源码分析) html_outputer.py : 将抓取的信息,输出到网页中 result.html : 显示抓取的信息,内容由html_outputer.py 进行动态生成 spider_main.py : 程序入口(主文件):负责各种调度工作 代码: from bugSpider import url_manage, html_download, html_parser, html_outputer class SpiderMain(object): def __init__(self): # url 地址管理 self.urls = url_manage.UrlManager() # 下载网页 self.downloader = html_download.HtmlDownLoader() # 解析网页 self.parser = html_parser.HtmlParse() # 输出信息 self.outputer = html_outputer.HtmlOutputer() # 执行爬虫任务 def craw(self,root_url): count = 1 self.urls.add_new_url(root_url) # 添加入口URL while self.urls.has_new_url(): # 循环判断是否有未爬的URL new_url = self.urls.get_new_url() # 得到一个未爬的URL try: html_cont = self.downloader.download(new_url) # 通过下载器下载页面 new_urls,new_data = self.parser.parse(new_url,html_cont) # 解析器解析页面数据,得到新的URL列表及数据 self.urls.add_new_urls(new_urls) # 添加新的URL列表 if (len(new_data)>0) : print("craw %d:%s" % (count, new_url)) self.outputer.collect_data(new_data) # 收集要输出的数据 count = count + 1 if count == 100: break except : print("craw fail") self.urls.has_new_url() self.outputer.output_html() if __name__ == "__main__": root_url = "https://www.cnblogs.com" obj_spider = SpiderMain() obj_spider.craw(root_url) url_manage.py : 主要是管理链接地址(需要爬的链接) # url 地址管理的类 # 专门写关于地址的一些方法 class UrlManager(object): def __init__(self): # 未访问的链接 self.new_urls = set() # 已经访问的链接 self.old_urls = set() # 添加一个新的地址 def add_new_url(self,url): if url is None : return if 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 : return for url in urls: self.add_new_url(url) # 判断是否还有新的地址 def has_new_url(self): return len(self.new_urls)!=0 # 获取一个新地址 def get_new_url(self): new_url = self.new_urls.pop() self.old_urls.add(new_url) return new_url html_download.py: 根据url地址,下载网页内容 import urllib.request # 下载对应的网页 class HtmlDownLoader(object): def download(self, url): if url is None: return None # 根据url地址,获取网页资源 response = urllib.request.urlopen(url) if response.getcode() != 200: return None # 返回网页的信息 return response.read() html_parser.py : 分析网页内容得到自己想要的信息(本页面是关键,要根据不同的网站来进行源码分析) import re import urllib.parse from bs4 import BeautifulSoup # 对html进行解析的类 class HtmlParse(object): # 解析的方法 # page_url: 页面地址 # html_cont: 页面内容 def parse(self, page_url, html_cont): if page_url is None or html_cont is None: return soup = BeautifulSoup(html_cont,'html.parser') # 调用解析URL地址的方法 new_urls = self._get_new_urls(page_url,soup) # 调用解析出数据的方法 new_data = self._get_new_data(page_url,soup) return new_urls,new_data # 获取新的URL地址 def _get_new_urls(self, page_url, soup): new_urls = set() # class="titlelnk" 博客园列表 print(page_url) links = soup.find_all('a',class_='titlelnk') print(page_url.find('https://www.cnblogs.com/#p')) if page_url == "https://www.cnblogs.com": one_url = page_url + "/#p2" new_urls.add(one_url) elif page_url.find('https://www.cnblogs.com/#p') > -1: page = int(page_url[len(page_url)-1])+1 two_url = "https://www.cnblogs.com/#p" + page print(two_url) new_urls.add(two_url) # class="postTitle2" 个人博客列表 # readList = soup.find_all('a',class_="postTitle2") # # if readList is not None and len(readList)>0: # links2 = readList.find("a") # links.add(links2) for link in links: new_url = link['href'] new_full_url = urllib.parse.urljoin(page_url,new_url) new_urls.add(new_full_url) new_urls.add(new_full_url.find('/')) return new_urls # 获取新的数据 def _get_new_data(self, page_url, soup): res_data = {} # a .postTitle2 title_node = soup.find('a',class_='postTitle2') if title_node is None: res_data = {} elif title_node.get_text().find('error') > -1 or title_node.get_text().find('错误') > -1 or title_node.get_text().find('错') > -1: res_data['url'] = page_url res_data['title'] = title_node.get_text() return res_data html_outputer.py : 将抓取的信息,输出到网页中 # 输出爬虫所爬的相关数据 class HtmlOutputer(object): def __init__(self): self.datas = [] # 收集数据 def collect_data(self, data): if data is None: return self.datas.append(data) # 将数据输出到网页上 def output_html(self): fout = open('result.html','w',encoding='utf-8') fout.write('<html>') fout.write('<head>') fout.write('<meta charset="utf-8" />') fout.write('</head>') fout.write('<body>') fout.write('<table>') for data in self.datas: fout.write('<tr>') fout.write('<td>%s</td>' % data['url']) fout.write('<td>%s</td>' % data['title']) # fout.write('<td>%s</td>' % data['summary']) fout.write('</tr>') fout.write('</table>') fout.write('</body>') fout.write('</html>') result.html : 显示抓取的信息,内容由html_outputer.py 进行动态生成 |
|
