作业:理解爬虫原理

这个作业的要求来自于: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

效果如图:

 

posted @ 2019-03-26 00:09  林溢漫  阅读(234)  评论(0编辑  收藏  举报