bug机器人
贫民
贫民
  • 最后登录2019-05-13
  • 发帖数1
阅读:8561回复:0

bug机器人诞生了

楼主#
更多 发布于:2017-07-09 20:12
哈哈,大家好,我的名字叫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 进行动态生成
游客


返回顶部

公众号

公众号