天天看點

Python進階篇:Python簡單爬蟲

目錄

  • 前言
  • 要解決的問題
  • 設計方案
  • 代碼說明
  • 小結

前言

前一段一直在打基礎,已經學習了變量,流程控制,循環,函數這幾塊的知識點,就想通過寫寫小程式來實踐一下,來加深知識點的記憶和了解。首先考慮的就是爬蟲啦,一直很崇拜爬蟲大師,特别想能夠學習一些爬蟲技術,去淘寶上爬爬資料,說不定什麼時候可以使用資料進行一些分析,比如哪天自己也開了個小店啥的~~。為了能夠開始起步, 我看了一些視訊,查閱了一些資料,起步階段就不用那些很牛逼的架構了,主要是想通過基本的爬蟲來了解爬蟲的基本概念和思路。

要解決的問題

查閱百度百科的某個關鍵詞以及相關聯的關鍵詞的集合。這是一個比較有意義的事情,通過這樣的資料能更好的了解相關的生态圈。比如我查閱“分布式計算”  http://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97/85448 文章裡面含有很多的有連結的關鍵詞,就這樣不斷的疊代去爬這些連結的關鍵詞的文章内的關鍵詞。

設計方案

爬蟲含有5個組成部分:主程式,URL管理器,HTML下載下傳器,HTML解析器,結果展示器

主程式:排程其他的部件的執行,并作為主程式入口來執行代碼

URL管理器: 管理URL的集合以及狀态 - 未下載下傳的URL,已下載下傳的URL,添加新的URL,去除已現在的URL

HTML下載下傳器: 下載下傳URL對應的HTML

HTML解析器: 解析下載下傳下來的HTML,取出有用的資料

結果展示器: 組織最終生成的資料,并展示或者存儲起來

代碼說明

  • 代碼組織架構
Python進階篇:Python簡單爬蟲
  •  代碼展示
部件名稱 程式名稱 代碼
主程式 SpiderMain.py
from Spider import UrlManager,HtmlDownloader,HtmlParser,HtmlOutputer

class Spider(object):

    def __init__(self):
        self.urlmanager = UrlManager.Manager()
        self.htmldownloader = HtmlDownloader.Downloader()
        self.htmlparser = HtmlParser.Parser()
        self.htmloutputer = HtmlOutputer.Outputer()


    def scrpy(self, root_url):
        self.urlmanager.add_new_urls(root_url)
        count = 1
        while(self.urlmanager.has_new_url()):
            if(count>10):
                break

            curr_url = self.urlmanager.get_new_url()
            html_content = self.htmldownloader.load(curr_url)
            print("No.%d Downloading URL %s" % (count, curr_url))
            word,new_urls,lemmasummary = self.htmlparser.parse(curr_url,html_content)
            data={}
            data['word']=word
            data['curr_url']=curr_url
            data['lemmasummary']=lemmasummary
            self.htmloutputer.collect(data)
            self.urlmanager.add_new_urls(new_urls)
            count = count + 1
        self.htmloutputer.genhtml()



if(__name__=='__main__'):
    root_url = "http://baike.baidu.com/item/%E5%88%86%E5%B8%83%E5%BC%8F%E8%AE%A1%E7%AE%97/85448"
    spider = Spider()
    spider.scrpy({root_url})      
URL管理器 UrlManager.py
class Manager(object):
    def __init__(self):
        self.old_urls=set()
        self.new_urls=set()

    def add_new_urls(self, root_url):
        for url in root_url:
            if(root_url not in self.old_urls and  root_url not in self.new_urls):
                self.new_urls.add(url)

    def has_new_url(self):
        if(len(self.new_urls) > 0):
            return True
        else:
            return False

    def get_new_url(self):
        tmp=self.new_urls.pop()
        self.old_urls.add(tmp)
        return tmp      
HTML下載下傳器 HtmlDownloader.py
import urllib.request

class Downloader(object):
    def load(self, curr_url):
        html = urllib.request.urlopen(curr_url)
        return html.read().decode("UTF-8",'ignore')      
HTML解析器 HtmlParser.py
import re
from urllib.parse import urljoin
from bs4 import BeautifulSoup

class Parser(object):
    def __init__(self):
        self.title = ''
        self.urls = set()
        self.lemmasummary = ''

    def parse(self, curr_url, html_content):
        soup = BeautifulSoup(html_content, 'html.parser',from_encoding="utf-8")
        soupurls=soup.find_all('a',href=re.compile(r'/view'))
        for url in soupurls:
           self.urls.add(urljoin(curr_url,url['href']))
        self.title = soup.title.string.split("_")[0]
        self.lemmasummary = soup.find('div',class_='lemma-summary')
        return self.title,self.urls,self.lemmasummary      
結果展示器 HtmlOutputer.py
class Outputer(object):
    def __init__(self):
        self.table = []

    def collect(self, data):
        self.table.append(data)

    def genhtml(self):
        html = open('result.html','w')
        html.write("<html>")
        html.write("<head>")
        html.write("</head>")
        html.write("<body>")
        html.write("<table>")
        for data in self.table:
            html.write("<tr>")
            html.write("<td>%s</td>" % data['word'])
            html.write("<td>%s</td>" % data['curr_url'])
            html.write("<td>%s</td>" % data['lemmasummary'])
            html.write("</tr>")
        html.write("</table>")
        html.write("</body>")
        html.write("</html>")
        html.close()      
  •  最終的結果
Python進階篇:Python簡單爬蟲

小結

在上面的爬蟲代碼裡面,主要展現了爬蟲的幾個部件之間的配合,以及每個部件的所引用的子產品,比如urllib,bs4,re

轉載于:https://www.cnblogs.com/benchen/p/6111840.html