Python——爬取百度百科关键词1000个相关网页

2023-05-16

Python简单爬虫——爬取百度百科关键词1000个相关网页——标题和简介

 

 

 

网站爬虫由浅入深:慢慢来

 

 

分析:

 

 

 

 

 

链接的URL分析:

 

 

 

 

 数据格式:

 

 

爬虫基本架构模型:

 

 

 

 

 

 

本爬虫架构:

 

 

 

 

 源代码:

 


# coding:utf8
# author:Jery
# datetime:2019/4/12 19:22
# software:PyCharm
# function:爬取百度百科关键词python1000个相关网页——标题和简介
from urllib.request import urlopen
import re
from bs4 import BeautifulSoup


class SpiderMain(object):
    def __init__(self):
        self.urls = UrlManager()
        self.downloader = HtmlDownloader()
        self.parser = HtmlParser()
        self.outputer = DataOutputer()

    # 主爬虫,调度四个类的方法执行爬虫
    def crawl(self, root_url):
        count = 1
        self.urls.add_new_url(root_url)
        while self.urls.has_new_url():
            try:
                new_url = self.urls.get_new_url()
                print("crawl 第{} :{} ".format(count, new_url))
                html_content = self.downloader.download(new_url)
                new_urls, new_data = self.parser.parse(new_url, html_content)
                # 新网页的url及数据
                self.urls.add_new_urls(new_urls)
                self.outputer.collect_data(new_data)
                if count == 1000:
                    break
                count += 1
            except:
                print(" crawl failed! ")
        self.outputer.output_html()

# URL管理器,实现URL的增加与删除
class UrlManager:
    def __init__(self):
        self.new_urls = set()
        self.old_urls = set()

    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

    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.new_urls.add(url)

# 下载网页源代码
class HtmlDownloader:
    def download(self, url):
        if url in None:
            return
        response = urlopen(url)
        if response.getcode() != 200:
            return
        return response.read()

# 下载网页所需内容
class HtmlParser:
    def parse(self, page_url, html_content):
        if page_url is None or html_content is None:
            return
        soup = BeautifulSoup(html_content, 'lxml', from_encoding='utf-8')
        new_urls = self._get_new_urls(page_url, soup)
        new_data = self._get_new_data(page_url, soup)
        return new_urls, new_data

    def _get_new_urls(self, page_url, soup):
        new_urls = set()
        links = soup.find_all('a', href=re.compile(r'/view/.*'))
        for link in links:
            new_url = "https://baike.baidu.com" + link['href']
            new_urls.add(new_url)
        return new_urls

    def _get_new_data(self, page_url, soup):
        res_data = {}
        # <dl class="lemmaWgt-lemmaTitle lemmaWgt-lemmaTitle-">
        # <dd class="lemmaWgt-lemmaTitle-title">
        # <h1>Python</h1>
        title_node = soup.find("dl", {"class": "lemmaWgt-lemmaTitle lemmaWgt-lemmaTitle-"}).dd.h1
        res_data['title'] = title_node.get_text()
        summary_node = soup.find('div', {"class": "lemma-summary"})
        res_data['summary'] = summary_node.get_text()
        return res_data

# 将所搜集数据输出至html的表格中
class DataOutputer:
    def __init__(self):
        self.datas = []

    def collect_data(self, data):
        if data is None:
            return
        self.datas.append(data)

    def output_html(self):
        output = open('output.html', 'w')
        output.write("<html>")
        output.write("<body>")
        output.write("<table>")
        for data in self.datas:
            output.write("<tr>")
            output.write("<td>{}</td>".format(data['url']))
            output.write("<td>{}</td>".format(data['title'].encode('utf-8')))
            output.write("<td>{}</td>".format(data['summary'].encode('utf-8')))
            output.write("</tr>")
        output.write("</table>")
        output.write("<body>")
        output.write("</html>")
        output.close()


if __name__ == '__main__':
    root_url = "https://baike.baidu.com/item/Python/407313"
    obj_spider = SpiderMain()
    obj_spider.crawl(root_url)  

 

转载于:https://www.cnblogs.com/Jery-9527/p/10701113.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python——爬取百度百科关键词1000个相关网页 的相关文章

随机推荐

  • 人脸识别程序流程图

    这是基于bpnn与opencv的人脸识别系统大致程序流程图 整个系统的实现还要依靠FPGA及其他硬件外设 这个系统的优点是将已经训练好的bpnn神经网络模型变换成二进制文件下载在flash中 xff0c 对采集的图片只要做相应的调整 xff
  • 检测SqlServer服务器IO是否瓶颈

    通过性能监视器监视 Avg Disk Queue Length 小于2 Avg Disk sec Read Avg Disk sec Write 小于10ms 可以用数据收集器定时收集 平均物理读次数最多的SQL语句 xff1a selec
  • Ubuntu下提升当前用户权限到root权限的坑与出坑方法

    由于使用gedit过程中很多时候权限不足 xff0c 想到将普通用户的权限提升为root权限的用户 经过问百度 xff0c 有博客说通过修改 34 etc passwd 34 文件 xff0c 提升用户权限 如博客 xff1a https
  • MariaDB 表的基本操作(3)

    MariaDB数据库管理系统是MySQL的一个分支 主要由开源社区在维护 采用GPL授权许可MariaDB的目的是完全兼容MySQL 包括API和命令行 MySQL由于现在闭源了 而能轻松成为MySQL的代替品 在存储引擎方面 使用Xtra
  • 流程审批设计

    这是我的项目中使用的一套关于工作流和审批流的配置 xff0c 算是比较简单的 xff0c 这里只写其中比较核心的思路 xff0c 算是对之前工作的一个技术总结吧 以下是数据库设计 xff1b 后面再跟据实例分析每个表的作用 首先是流程配置表
  • 文件流写到ftp服务器,采用ftpclient.storeFile(String, Inputstream)将流写到服务器,没报错但服务器上没有文件,这是怎么回事...

    满意答案 qingjixiaolan 推荐于 2018 04 27 创建一个FtpClient对象 FTPClient ftpClient 61 new FTPClient 上传文件 读取本地文件 file xff1a 需要上传的文件地址
  • TSA not available (for R version 3.6.3) 解决方法

    安装包 全部安装包路径 xff1a https cran r project org src contrib Archive TSA下载路径 xff1a https cran r project org src contrib Archiv
  • android banner设置图片比例,Banner基本使用 2.1.0

    Step 1 依赖banner Gradle dependencies compile 39 com youth banner banner 2 1 0 39 Step 2 添加权限到你的 AndroidManifest xml Step
  • int,bool,字符串知识总结

    一 xff1a int整数类型 bool类型 一 xff1a int类型 xff0c 整数 1 xff0c bit length 返回一个数的二进制长度 a 61 5 0 1 10 11 100 101 print a bit length
  • postgresql从库搭建

    1 复制类型 PostgreSQL支持物理复制 xff08 流复制 xff09 及逻辑复制2种 通过流复制技术 xff0c 可以从实例级复制出一个与主库一模一样的实例级的从库 流复制同步方式有同步 异步两种 另一种复制方式为逻辑复制 xff
  • NotePad 快捷键

    转载于 https www cnblogs com pxzbky p 11567346 html
  • 网络通信原理和过程

    当时查http协议的时候了解的一些网络底层的知识 xff0c 感觉挺有意思的 xff0c 就把多位博主的资料整料梳理出来整理到一堆 xff0c 就当是一篇科普文吧 一 网络的五层模型 如何分层有不同的模型 xff0c 有的模型分七层 xff
  • Springboot读取本地图片并显示

    在application xml中配置url访问路径和本地图片路径 xff1a 配置 url中访问路径 xff0c 这里为 xff1a localhost 8080 image 配置 本地图片保存的路径 xff0c image会根据D up
  • vue路由跳转到指定页面

    1 this router push name 39 Home 39 2 this router push path 39 view 39 3 this router replace name 39 Home 39 4 this route
  • Post方式提交,通过上下文HttpContext,Request[""]获取

    问题场景如下 xff1a 在项目的一般处理程序中 xff0c 所有方法都是通过 context Request 34 参数名 34 ToString 来获取参数的值 如果我直接将参数追加到URL后面 xff0c 直接Post xff0c 后
  • maven项目添加mysql的链接驱动

    Maven项目中添加JDBC驱动 在pom xml配置文件中添加 lt dependency gt lt groupId gt mysql lt groupId gt lt artifactId gt mysql connector jav
  • 2.5年, 从0到阿里

    从来没有想到自己的求职之路会这么顺利 第一次投阿里就拿到了offer 以前一直都是做好被刷的准备的 3月31号晚上收到了来自阿里的正式offer 签下录取意向书 粗略算了一下 从2012年9月份正式入学进入计算机系到2015年3月签下阿里o
  • 我的2013—弃金融IT,从SAP业务

    我的2013 xff0c 是动荡的一年 xff1b 这一年 xff0c 我跳巢了 xff1b 这一年 xff0c 我换行业了 xff1b 这一年 xff0c 我离开了生活5年的长春 xff0c 来到成都 xff1b 这一年 xff0c 我放
  • [转载]LazyWriter(惰性写入器) 进程的作用

    Q What Does the LazyWriter Process Do The LazyWriter process is a periodic process that checks the status of BPool buffe
  • Python——爬取百度百科关键词1000个相关网页

    Python简单爬虫 爬取百度百科关键词1000个相关网页 标题和简介 网站爬虫由浅入深 xff1a 慢慢来 分析 xff1a 链接的URL分析 xff1a 数据格式 xff1a 爬虫基本架构模型 xff1a 本爬虫架构 xff1a 源代码