基于Python的网络爬虫

一个爬虫的架构包括URL管理器,网页下载器,和网页解析器,管理待抓取的URL集合和已抓取URL集合,这样是为了防止重复抓取和循环抓取。

基于Python的网络爬虫_第1张图片


网页下载器

将互联网上URL对应的网页下载到本地的工具。

网页解析器

将下载的网页按照某种网页形式进行解析,找到需要的内容。

算法

一共创建4个类,url_manager,html_downloader,html_parser,spider_main。主类中构造函数创建其他三个类的对象。

在主类的爬取函数中,首先完成网页的下载和解析,并将解析的符合要求的URL添加到待爬取URL集合中。

html_downloader类只有一个方法,即用来下载网页。

html_parser类,包含一个私有方法,用来寻找课程的链接网址。

url_manager类中,设置两个存放URL的集合,一个作为待爬取的URL集合,一个作为已爬取的URL集合,若仍存在待爬取的URL,在获取该URL的同时,将其从待爬取集合中删除,添加到已爬取集合,防止重复爬取。get_text()方法可以获取标签中的文本内容。

代码如下:

#coding:utf8
import urllib.request
from bs4 import BeautifulSoup
import urllib.parse
import re
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):#添加批量URL
        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
class HtmlParser(object):
    def parse(self,html_cont):        
        soup = BeautifulSoup(html_cont, 'html.parser', from_encoding='utf-8')
        new_urls=self._get_new_urls(soup)
        return new_urls
    def _get_new_urls(self,soup):
        new_urls=set()
        links=soup.find_all('h3',class_="course-card-name")
        for link in links:

            new_urls.add(link)
        return new_urls
class HtmlDownloader(object):
    def download(self,url):
        if url is None:
            return None
        with urllib.request.urlopen(url) as response:
            if response.getcode()!=200:
                return None
            return (response.read())
class SpiderMain(object):
    def __init__(self):
        self.urls=UrlManager()
        self.downloader=HtmlDownloader()
        self.parser=HtmlParser()
    def craw(self,root_url):
        count=1
        html_cont=self.downloader.download(root_url)
        new_urls=self.parser.parse(html_cont)
        self.urls.add_new_urls(new_urls)
        while self.urls.has_new_url():
            try:
                new_url=self.urls.get_new_url()
                print ('craw %d:'%(count))
                print("course:%s"%new_url.get_text())
                count=count+1
                
            except:
                print ("craw failed")
if __name__=="__main__":
    root_url="https://www.imooc.com"
    obj_spider=SpiderMain()
    obj_spider.craw(root_url)





你可能感兴趣的:(python,网络爬虫,python)