当前位置: 首页 > article >正文

python爬虫入门(理论)

python爬虫

学习网站

在这里插入图片描述
在这里插入图片描述

一、准备

  1. 环境搭建

    • requests

    • beautifulsoup4

    • selenium

  2. 爬虫架构

在这里插入图片描述

  • URL管理器:管理URL,存储已爬取或待爬取的URL

  • 网页下载器:破解网页,进行下载

  • 网页解析器:对网页的HTML样式、连接的URL等进行解析

二、架构详解

  1. request网页下载器

    在这里插入图片描述

    • request:发送请求

    • response:返回数据
      在这里插入图片描述

  2. requests的使用

    1. url输入
    2. requests.get(url)获取
    3. status_code判断200/400
    4. headers获取各关键字段,encoding获取或修改编码类型,r.text获取文本
  3. URL管理器

    在这里插入图片描述

    • 对外接口:URL的获取和新增

    • 逻辑:取出时状态变成已爬取,新增时判断存在

    • 数据存储:

  4. URL管理器代码实现

    1. 整体思路:

      • 初始化:新旧路由列表存储
      • 新增URL:判断路由是否在新旧列表里,否add
      • 新增URL列表:判断路由是否存在,后循环调用↑
      • 获取URL:将url从新路由列表中取出并存入旧路由列表后返回此url
      • 判断URL是否已经存在:返回新列表长度>0
    2. 代码实现

      class UrlManager:
          """
          url路由器
          """
          # 初始化
          def __init__(self):
              self.new_urls = set()
              self.old_urls = set()
          #新增url
          def add_new_url(self,url):
              if url is None or len(url) == 0:
                  return
              if url in self.new_urls or url in self.old_urls:
                  return
              self.new_urls.add(url)
          #新增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)
      
          #获取一个url
          def get_url(self):
              if self.has_new_url():
                  url = self.new_urls.pop() # 将url从new_urls中取出
                  self.old_urls.add(url) # 添加到已经访问过的url中
                  return url
              else:
                  return None
          #判断url是否已经存在
          def has_new_url(self):
              return len(self.new_urls) > 0 # 判断是否为空
      
      # 测试,外界访问此类时,不会会执行此函数
      if __name__ == "__main__":
          url_manager = UrlManager()
          url_manager.add_new_url("url1")
          url_manager.add_new_urls(["url1","url2"])
          print(url_manager.new_urls,url_manager.old_urls)
      
          print("#"*30)
          new_url = url_manager.get_url()
          print(url_manager.new_urls,url_manager.old_urls)
      
          print("#" * 30)
          new_url = url_manager.get_url()
          print(url_manager.new_urls, url_manager.old_urls)
      
          print("#" * 30)
          new_url = url_manager.get_url()
          print(url_manager.new_urls, url_manager.old_urls)
      
  5. Beaytifulsoup解析HTML的实例

    • test.heml文件
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta http-equiv=Content-Type content="text/html;charset=utf-8">
        <title>网页标题</title>
    </head>
    <body>
        <h1>标题1</h1>
        <h2>标题2</h2>
        <h3>标题3</h3>
        <h4>标题4</h4>
    
    <div id="content" class="default">
        <p>段落</p>
        <a href="http://www.baidu.com">百度</a> <br/>
        <a href="http://www.crazyant.net">疯狂的蚂蚁</a> <br/>
        <a href="http://www.igiyi.com">爱奇艺</a> <br/>
        <img src="https://ww.python.org/static/img/python-logo.png"/>
    </div>
    </body>
    </html>
    
    • test.py
    from bs4 import BeautifulSoup
    
    # 读取html文件,不用关闭
    with open('./test.html',encoding='utf-8') as fin:
        html_doc  = fin.read()
    
    # 创建BeautifulSoup对象
    soup = BeautifulSoup(html_doc,"html.parser")
    
    # 定位,查找div标签
    div_node = soup.find("div",id="content")
    print(div_node)#检查
    
    print("#"*10)
    
    # 查找div标签下的所有a标签
    links = div_node.find_all('a')
    for link in links:
        print(link.name,link["href"],link.get_text())
    
    # 查找div标签下的img标签
    img = div_node.find("img")
    print(img["src"])
    
    

http://www.kler.cn/a/508195.html

相关文章:

  • 微服务中引入消息队列的利弊
  • Windows图形界面(GUI)-QT-C/C++ - QT 对话窗口
  • 一文掌握Docker
  • IvorySQL 4.0 之 Invisible Column 功能解析
  • ubuntu下安装编译cmake,grpc与protobuf
  • 玩转随机数:用 JavaScript 掌控不可预测的魔力!
  • error: 您尚未结束您的合并(存在 MERGE_HEAD)。 提示:请在合并前先提交您的修改。 fatal: 因为存在未完成的合并而退出。
  • SpringBoot 3.2.4整合Nacos详细流程
  • Django中的QueryDict对象
  • Qiankun 微前端框架全面解析:架构、原理与最佳实践
  • ideal jdk报错如何解决
  • 鸿蒙UI(ArkUI-方舟UI框架)-开发布局
  • Web端实时播放RTSP视频流(监控)
  • oracle goldengate from mongodb to oracle的实时同步
  • Git 仓库 大文件管理
  • Kafka客户端-“远程主机强迫关闭了一个现有的连接”故障排查及解决
  • 闪豆多平台视频批量下载器
  • Git:标签管理
  • 【JAVA 基础 第(19)课】Hashtable 类用法和注意细节,是Map接口的实现类
  • 青少年编程与数学 02-007 PostgreSQL数据库应用 02课题、PostgreSQL数据库安装
  • “扣子”开发之四:与千帆AppBuilder比较
  • 冒泡排序 选择排序 插入排序
  • Scrapy中间件的使用
  • OpenCSG助力国产大模型|YuLan-Mini:数据高效的AI模型突破
  • Spring Boot框架总结(超级详细)
  • 程序设计:排版、检验报告的上下标解决几种办法