Python爬虫学习(3)

在慕课网学习并创建了一个简单的爬虫包,爬取百度百科相关词条信息

程序中会用到第三方解析包(BeautifulSoup4),Windows环境下安装命令:pip install BeautifulSoup4

1、新建包

2、新建相关类文件,其中包含有:

  index.py,包入口类文件;

  url_manager.py,url管理器类文件,主要管理待爬url列表和已爬url列表,避免重复或循环爬取;

  html_downloader.py,html内容下载器类文件,下载接收url内容到本地;

  html_parser.py,html内容解析器类文件,解析url内容,取出需求数据;

  html_outputer.py,爬取内容收集输出器类文件,主要收集各url中需求数据并输出;

3、贴(代码注释好详细的。。。)

index.py

# !/usr/bin/env python
# -*- coding: UTF-8 -*-
# addUser: Gao
# addTime: 2018-01-31 22:22
# description: 入口

from Crawler import url_manager, html_downloader, html_parser, html_outputer

class Index(object):

    # 构造函数 初始化各管理器
    def __init__(self):
        # url管理器
        self.urls = url_manager.UrlManager()
        # html下载管理器
        self.downloader = html_downloader.HtmlDownloader()
        # html解析管理器
        self.parser = html_parser.HtmlParser()
        # 数据收集管理器
        self.outputer = html_outputer.HtmlOutputer()

    # 爬虫
    def craw(self, url):
        count = 1

        # 将初始地址加入url管理器
        self.urls.add_new_url(url)

        # 判断是否存在新的url地址 存在时执行爬取程序
        while self.urls.has_new_url():
            try:
                # 获取新的url地址
                new_url = self.urls.get_new_url()
                print ‘craw %d : %s‘ % (count, new_url)

                # 获取url地址内容
                html_cont = self.downloader.download(new_url)

                # 解析url内容
                news_url, new_data = self.parser.parse(new_url, html_cont)

                # 将解析得到的url地址列表批量加入url管理器中
                self.urls.add_new_urls(news_url)

                # 收集数据
                self.outputer.collect_data(new_data)

                if count == 100:
                    break
                count += 1

            # 异常处理
            except:
                print ‘craw failed‘

        # 输出收集的数据
        self.outputer.output_html()

if __name__ == ‘__main__‘:
    # 初始url地址
    initial_url = ‘https://baike.baidu.com/item/%E5%94%90%E8%AF%97%E4%B8%89%E7%99%BE%E9%A6%96/18677‘

    # 创建对象
    Obj = Index()

    # 调用爬虫
    Obj.craw(initial_url)

url_manager.py

# !/usr/bin/env python
# -*- coding: UTF-8 -*-
# addUser: Gao
# addTime: 2018-01-31 22:22
# description: url管理器

class UrlManager(object):
    # 构造函数 初始化url列表
    def __init__(self):
        # 待爬url列表
        self.new_urls = set()
        # 已爬url列表
        self.old_urls = set()

    # 添加单个url
    def add_new_url(self, url):
        # 判断url是否为空
        if url is None:
            return
        # 判断url是否已存在或是否已爬
        if url not in self.new_urls and url not in self.old_urls:
            # 添加到待爬url列表
            self.new_urls.add(url)

    # 批量添加url
    def add_new_urls(self, urls):
        # 判断urls是否为空
        if urls is None or len(urls)==0:
            return
        # 循环执行添加单个url
        for url in urls:
            self.add_new_url(url)

    # 判断是否存在新的(未爬取)url
    def has_new_url(self):
        return len(self.new_urls) != 0

    # 获取新的(未爬取)url
    def get_new_url(self):
        # 取出待爬url列表中的一个url
        new_url = self.new_urls.pop()
        # 将取出的url添加到已爬url列表中
        self.old_urls.add(new_url)
        # 返回取出的url
        return new_url

html_downloader.py

# !/usr/bin/env python
# -*- coding: UTF-8 -*-
# addUser: Gao
# addTime: 2018-01-31 22:22
# description: html下载器

import urllib2

class HtmlDownloader(object):

    # 下载url内容
    def download(self, url):
        # 判断url是否为空
        if url is None:
            return None

        # 下载url内容
        response = urllib2.urlopen(url)
        # 判断url地址请求结果
        if response.getcode() != 200:
            return None
        # 返回url加载内容
        return response.read()

html_parser.py

# !/usr/bin/env python
# -*- coding: UTF-8 -*-
# addUser: Gao
# addTime: 2018-01-31 22:22
# description: html解析器

import re, urlparse
from bs4 import BeautifulSoup

class HtmlParser(object):

    # 解析url的内容
    def parse(self, url, html_cont):
        # 参数为空判断
        if url is None or html_cont is None:
            return

        # 创建解析对象
        soup = BeautifulSoup(html_cont, ‘html.parser‘, from_encoding=‘utf-8‘)
        # 获取新的待爬url列表
        new_urls = self._get_new_urls(url, soup)
        # 获取需求数据
        new_data = self._get_new_data(url, soup)
        # 返回url列表和数据
        return new_urls, new_data

    # 获取url内容中的词条url列表
    def _get_new_urls(self, url, soup):
        # 初始化url列表
        new_urls = set()

        # 获取页面所有词条a标签列表
        links = soup.find_all(‘a‘, href=re.compile(r‘^/item/‘))
        for link in links:
            new_url = link[‘href‘]  # 获取a标签中href属性值
            full_url = urlparse.urljoin(url, new_url)   # 拼接完整url地址
            new_urls.add(full_url)  # 将完整的url添加到url列表中

        # 返回url列表
        return new_urls

    # 获取url内容中的需求数据
    def _get_new_data(self, url, soup):
        # 初始化数据词典
        data = {}

        title_node = soup.find(‘dd‘, class_=‘lemmaWgt-lemmaTitle-title‘).find(‘h1‘)     # 获取标题标签
        data[‘title‘] = title_node.get_text()   # 获取标题文本

        summary_node = soup.find(‘div‘, class_=‘lemma-summary‘)     # 获取词条概要标签
        data[‘summary‘] = summary_node.get_text()   # 获取词条概要文本

        data[‘url‘] = url  # 词条对应url地址

        # 返回数据
        return data

html_outputer.py

# !/usr/bin/env python
# -*- coding: UTF-8 -*-
# addUser: Gao
# addTime: 2018-01-31 22:22
# description: html输出器

class HtmlOutputer(object):

    # 构造函数 初始化收集的数据
    def __init__(self):
        self.Data = []

    # 收集数据
    def collect_data(self, data):
        # 数据为空判断
        if data is None:
            return
        # 添加数据到列表
        self.Data.append(data)

    # 输出收集的数据
    def output_html(self):
        # 打开文件
        out_file = open(‘output.html‘, ‘w‘)

        out_file.write(‘<html><body><table>‘)

        for data in self.Data:
            out_file.write(‘<tr>‘)
            out_file.write(‘<td>%s</td>‘ % data[‘title‘].encode(‘utf-8‘))
            out_file.write(‘<td>%s</td>‘ % data[‘url‘].encode(‘utf-8‘))
            out_file.write(‘<td>%s</td>‘ % data[‘summary‘].encode(‘utf-8‘))
            out_file.write(‘</tr>‘)

        out_file.write(‘</table></body></html>‘)

        # 关闭文件
        out_file.close()

4、运行和调用

  代码撸完了,肯定要看看它是否能使用啦

  在包中,选择入口类文件(index.py),右击执行Run命令;

  在包外,即调用该爬虫包,首先要引入该包入口类文件(index.py),再实例化对象,最后调用爬取方法,当然还得执行Run命令啦。

  

我的代码:https://github.com/HeyEasy/PythonCode

原文地址:https://www.cnblogs.com/MrGaoyi/p/8398496.html

时间: 2024-11-01 17:09:47

Python爬虫学习(3)的相关文章

Python爬虫学习系列教程

Python爬虫学习系列教程 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. Python版本:2.7 一.爬虫入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫入门四之Urllib库

Python爬虫学习:四、headers和data的获取

之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.com/ 打开网页,按下F12键,如下图所示: 点击下方标签中的Network,如下: 之后再点击下图所示位置: 找到红色下划线位置所示的标签并点击,在右边的显示内容中可以查看到所需要的headers信息. 一般只需要添加User-Agent这一信息就足够了,headers同样也是字典类型: user

Python爬虫学习:三、爬虫的基本操作流程

本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将数据或信息存入数据库中: 3.数据展示,即在Web端进行显示,并有自己的分析说明. 这次我先介绍第一个功能中所需要实现的基本操作: 爬虫的基本操作:      表示必须步骤           表示可选步骤 导入爬虫所需要的库(如:urllib.urllib2.BeautifulSoup.Scrap

2018/7/21 Python 爬虫学习

2018/7/21,这几天整理出来的一些Python 爬虫学习代码. import urllib2 response = urllib2.urlopen("http://baidu.com") html = response.read() print html 进一步,可以request import urllib2 req = urllib2.Request("http://www.baidu.com") response = urllib2.urlopen(re

Python爬虫学习路线,强烈建议收藏这十一条

(一)如何学习Python 学习Python大致可以分为以下几个阶段: 1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量.数据结构.语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Python 简介 | 菜鸟教程 2.看完基础后,就是做一些小项目巩固基础,比方说:做一个终端计算器,如果实在找不到什么练手项目,可以在 Codecademy - learn to code, interactively, for free 上面进行练习. 如果时间充裕的

开始我的Python爬虫学习之路

因为工作需要经常收集一些数据,我就想通过学爬虫来实现自动化完成比较重复的任务. 目前我Python的状况,跟着敲了几个教程,也算是懂点基础,具体比较深入的知识,是打算从做项目中慢慢去了解学习. 我是觉得如果一开始就钻细节的话,是很容易受到打击而放弃的,做点小项目让自己获得点成就感路才更容易更有信心走下去. 反正遇到不懂的就多查多问就对了. 知乎上看了很多关于入门Python爬虫的问答,给自己总结出了大概的学习方向. 基础: HTML&CSS,JOSN,HTTP协议(这些要了解,不太需要精通) R

Python实战:Python爬虫学习教程,获取电影排行榜

Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习Python这门语言. 本文是在前一部分Python基础之上程序员带你十天快速入门Python,玩转电脑软件开发(四),再次进行的Python爬虫实战课程. 正则表达式实例简单详解 正则表达式干什么用? 就是在字符串中提取我们需要的内容的. 记得哦,要先引用正则表达式模块的哦. re就是正则表达式相

《Python爬虫学习系列教程》学习笔记

转自:http://cuiqingcai.com/1052.html 大家好哈,我呢最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多.学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴趣的童鞋有帮助,如果有机会期待与大家的交流. 一.Python入门 1. Python爬虫入门一之综述 2. Python爬虫入门二之爬虫基础了解 3. Python爬虫入门三之Urllib库的基本使用 4. Python爬虫

Python爬虫学习一之Requests包使用方法

Requests函数库是学习Python爬虫必备之一, 能够帮助我们方便地爬取. 本文主要参考了其官方文档. Requests安装: requests目前的版本是v2.11.1, 在WINDOWS上可以通过命令行窗口(运行cmd命令), 利用pip进行自动地安装(很方便): > pip install requestsCollecting requests Downloading requests-2.11.1-py2.py3-none-any.whl <514kB>Installing

Python爬虫学习(1)

接触python不久,也在慕课网学习了一些python相关基础,对于爬虫初步认为是依靠一系列正则获取目标内容数据 于是参照着慕课网上的教学视频,完成了我的第一个python爬虫,鸡冻 >_< # !/usr/bin/env python # -*- coding: UTF-8 -*- # addUser: Gao # addTime: 2018-01-27 23:06 # description: python爬虫练习 import urllib2, re, os # 获取目标网址 Targe