zoukankan      html  css  js  c++  java
  • 作业:理解爬虫原理

    这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2851

    1. 简单说明爬虫原理

    请求网站并提取数据的自动化程序。基本流程:发起请求、获取响应内容、解析内容和保存数据。

    2. 理解爬虫开发过程

    1).简要说明浏览器工作原理;

    浏览器工作原理的实质就是实现http协议的通讯,具体过程如下:
    HTTP通信的流程,大体分为三个阶段:
    (1)连接:服务器通过一个ServerSocket类对象对8000端口进行监听,监听到之后建立连接,打开一个socket虚拟文件。
    (2)请求:创建与建立socket连接相关的流对象后,浏览器获取请求,为GET请求,则从请求信息中获取所访问的HTML文件名,向服务器发送请求。
    (3)应答:服务收到请求后,搜索相关目录文件,若不存在,返回错误信息;若存在,则将html文件进行加HTTP头等处理后响应给浏览器,浏览器解析html文件,若其中还包含图片,视频等请求,则浏览器再次访问web服务器,异常获取图片视频等,并对其进行组装显示出来。

    2).使用 requests 库抓取网站数据;

    代码如下:

    # -*- coding: utf-8 -*-
    """
    Spyder Editor
    
    This is a temporary script file.
    """
    
    import bs4
    import requests
    from bs4 import BeautifulSoup
    url="https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2"
    res=requests.get(url)
    print(res)
    print(bs4)
    print(res.status_code)
    print(res.encoding)
    print(res.text)

    效果如图:

    3).了解网页

     <body class="app flex-row align-items-center">
        <div class="container">
          <div class="row justify-content-center">
            <div class="col-md-6">
              <div class="card mx-4">
                <div class="card-body p-4">
                  <h1>Register</h1>
                  <p class="text-muted">Create your account</p>
                  <div class="input-group mb-3">
                    <div class="input-group-prepend">
                      <span class="input-group-text">
                        <i class="icon-user"></i>
                      </span>
                    </div>
                    <input class="form-control" type="text" placeholder="Username">
                  </div>
                  <div class="input-group mb-3">
                    <div class="input-group-prepend">
                      <span class="input-group-text">@</span>
                    </div>
                    <input class="form-control" type="text" placeholder="Email">
                  </div>
                  <div class="input-group mb-3">
                    <div class="input-group-prepend">
                      <span class="input-group-text">
                        <i class="icon-lock"></i>
                      </span>
                    </div>
                    <input class="form-control" type="password" placeholder="Password">
                  </div>
                  <div class="input-group mb-4">
                    <div class="input-group-prepend">
                      <span class="input-group-text">
                        <i class="icon-lock"></i>
                      </span>
                    </div>
                    <input class="form-control" type="password" placeholder="Repeat password">
                  </div>
                  <button class="btn btn-block btn-success" type="button">Create Account</button>
                </div>
                <div class="card-footer p-4">
                  <div class="row">
                    <div class="col-6">
                      <button class="btn btn-block btn-facebook" type="button">
                        <span>facebook</span>
                      </button>
                    </div>
                    <div class="col-6">
                      <button class="btn btn-block btn-twitter" type="button">
                        <span>twitter</span>
                      </button>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </body>

    4).使用 Beautiful Soup 解析网页;

    通过BeautifulSoup(html_sample,'html.parser')把上述html文件解析成DOM Tree

    代码如下:

    soup=BeautifulSoup(res.text,'html.parser')
    soup.select('li')
    for news in soup.select('li'):
        if len(news.select('.am-list-item-hd'))>0:
            t=news.select('.am-list-item-hd')[0].text
            a=news.select('a')[0]['href']
            print(t,a)

    效果如图:

     

    3.提取一篇校园新闻的标题、发布时间、发布单位

    代码如下:

    import requests
    import bs4
    from bs4 import BeautifulSoup
    from datetime import datetime
    
    
    #========================================================================
    #1.用requests库和BeautifulSoup库,爬取校园新闻首页新闻的标题、链接、正文。
    #========================================================================
    url='http://news.gzcc.cn/html/xiaoyuanxinwen/'
    res=requests.get(url)
    res.encoding='utf-8'
    soup=BeautifulSoup(res.text,'html.parser')
    
    for news in soup.select('li'):
        if len(news.select('.news-list-title'))>0:
            title=news.select('.news-list-title')[0].text              #pertitle   每则新闻题目
            content=news.select('.news-list-info')[0].contents[0].text  #perDetail  每则新闻详细内容
            newshref=news.select('a')[0].attrs['href']                 #perHref    每则新闻源链接
    
            # ————————————爬取子页面内容——————————————————————————
            perdetail=requests.get(newshref)
            perdetail.encoding='utf-8'
            soupDetail=BeautifulSoup(perdetail.text,'html.parser')
            textContent=soupDetail.select('#content')[0].text
    
            #————————————输出内容——————————————
            print('题目:',title)
            print('发布时间:',content)
            print('源页面:',newshref)
            print('正文内容:',textContent)
            break;
    #=============================================================
    #2.分析字符串,获取每篇新闻的发布时间,作者,来源,摄影等信息。
    #=============================================================
    info=soupDetail.select('.show-info')[0].text
    catagory=['发布时间:','审核:','作者:','摄影:','来源:','点击:']
    i=0
    while(i<len(catagory)):
        valid=info.find(catagory[i])
        if(valid>=0):
            s=info[info.find(catagory[i]):].split()[0].lstrip(catagory[i])
    #=============================================================
    #3.将其中的发布时间由str转换成datetime类型。
    #=============================================================
            if(valid>0 and i==0):
               timeC=datetime.strptime(s,'%Y-%m-%d %H:%M:%S') 
               print(catagory[i]+s)
        i=i+1

    效果如图:

  • 相关阅读:
    SharePoint 2010 User Profile Sync Service自动停止
    如何区别多个svchost.exe?
    Log Parser分析IIS log的一个简单例子
    Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
    Windows中右键点击文件夹, 结果找不到共享选项卡, 怎么办?
    介绍SOS中的SaveModule命令
    SharePoint中Draft版本的文档不会收到document added的Alert Email
    和我一起学Windows Workflow Foundation(1)创建和调试一个WF实例
    门户网站
    C#基础—— check、lock、using语句归纳
  • 原文地址:https://www.cnblogs.com/linyiman/p/10594808.html
Copyright © 2011-2022 走看看