头歌答案--爬虫实战

目录

[urllib 爬虫?](#urllib 爬虫?)

第1关:urllib基础

任务描述

第2关:urllib进阶?

任务描述

[requests 爬虫](#requests 爬虫)

[第1关:requests 基础](#第1关:requests 基础)

任务描述

[第2关:requests 进阶](#第2关:requests 进阶)

任务描述

网页数据解析

第1关:XPath解析网页?

任务描述

第2关:BeautifulSoup解析网页?

任务描述

JSON数据解析

第1关:JSON解析?

任务描述

爬虫实战------网页抓取及信息提取

第1关:利用URL获取超文本文件并保存至本地?

任务描述

第2关:提取子链接?

任务描述

第3关:网页数据分析?

任务描述


urllib 爬虫

第1关:urllib基础
任务描述

本关任务:掌握 urlopen 函数的使用,完成一个简易的爬取程序。

复制代码
import urllib.request
def request(url):
    '''
    一个参数
    :param url:请求网址
    :return:返回一个请求的字符串。编码为utf-8
    '''
    # *************** Begin *************** #
    r=urllib.request.urlopen(url) 
    return r.read().decode('utf-8')
    # *************** End ***************** #
第2关:urllib进阶
任务描述

本关任务:利用 Opener 方法,完成一个简易的爬取程序。

复制代码
import urllib.request
import http.cookiejar
def request(url,headers):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return:html
    '''
    
    # ***************** Begin ******************** #
    cookie = http.cookiejar.CookieJar()
    handler = urllib.request.HTTPCookieProcessor(cookie) 
    opener = urllib.request.build_opener(handler)
    r=  opener.open(url)
    
    # ***************** End ******************** #
    html = r.read().decode('utf-8')
    return html

requests 爬虫

第1关:requests 基础
任务描述

本关任务:编写一个 requests 请求网页的程序。

复制代码
import requests
 
 
def get_html(url):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return:html
    '''
    
    # ***************** Begin ******************** #
 
    # 补充请求头
    headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/"
                  "537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
    # get请求网页
    response = requests.get(url=url, headers=headers)  # 模拟登录请求
    response.encoding = "utf-8"  # 定义编码
    # 获取网页信息文本
    html = response.text
    # ***************** End ******************** #
    return html
第2关:requests 进阶
任务描述

本关任务:使用 session 编写爬取网页的小程序。

复制代码
import requests
 
 
def get_html(url):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return html 网页的源码
    :return sess 创建的会话
    '''
    
    # ***************** Begin ******************** #
    
    # 补充请求头
    headers={ 'User-Agent':'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/'
                  '537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36',
    "Cookie":"BAIDUID=53B7CC4BFCDC39D2EF625C13D285429D:FG=1; BIDUPSID=53B7CC4BFCDC39D2EF625C13D285429D; "
              "PSTM=1591665716; BD_UPN=12314753; BDUSS=2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR"
              "VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
              "AAAAAAAAAAAAMzw3l7M8N5eS; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; sug=3; sugstore=1; ORIGIN=0; bdime=0; "
              "H_PS_PSSID=1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer=0; BD_CK_SAM=1; PSINO=6; "
              "H_PS_645EC=3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM=0"
              }
 
    # 创建Session, 并使用Session的get请求网页
    sess = requests.session()
    # 获取网页信息文本
    response = sess.get(url,headers=headers)
    response_home = sess.get(url=url)
    html=response.text
    # ****************** End ********************* #
    return html, sess

网页数据解析

第1关:XPath解析网页
任务描述

本关任务:在 XPath 基础实训中,介绍了 XPath 的基础知识,本关需要使用 XPath 技术来编写解析网页的程序。

复制代码
import urllib.request
 
from lxml import etree
 
def get_data(url):
    '''
    :param url: 请求地址
    :return: None
    '''
    response=urllib.request.urlopen(url=url)
    html=response.read().decode("utf-8")
    # *************** Begin *************** #
    parse = etree.HTML(html)  
    # 写入xpath路径  
    item_list = parse.xpath("//div[@class='left']/ul/li/span/a/text()")   
    #item_list = parse.xpath("/html/body/div[2]/div[1]/ul/li/span/a.text()")   
    # *************** End ***************** #
 
    print(item_list)
第2关:BeautifulSoup解析网页
任务描述

本关任务:使用 BeautifulSoup 解析网页爬取古诗词的内容部分。

复制代码
import requests
from bs4 import BeautifulSoup
def get_data(url, headers):
    '''
    两个参数
    :param url:统一资源定位符,请求网址
    :param headers:请求头
    :return data:list类型的所有古诗内容
    '''
    # ***************** Begin ******************** #
    response = requests.get(url, headers=headers)  
    response.encoding = "utf-8"  
    html = response.text  
    soup = BeautifulSoup(html, 'lxml')  
    data = soup.find('div', {'class': 'left'}).ul.find_all('li')  
    data = [i.p.text for i in data]
    # ****************** end ********************* #
    return data

JSON数据解析

第1关:JSON解析
任务描述

本关任务:编写一个能用 JSON 解析爬虫数据的小程序。

复制代码
import urllib.request
from lxml import etree
import http.cookiejar
import json

def request_sess(url,headers):
    cj=http.cookiejar.CookieJar()
    opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    request = urllib.request.Request(url=url, headers=headers)
    r=opener.open(fullurl=request)
    html = r.read().decode('utf-8')
    return html
   
def save_data(path):
    '''
    :param path: 文件保存路径
    :return: 无
    '''
    url='http://127.0.0.1:8080/index'
    headers={
        'User-Agent':'Mozilla/5.0 (Linux; Android 8.0.0; Pixel 2 XL Build/OPD1.170816.004) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Mobile Safari/537.36'
    }
    # ********** Begin ************** #
    json_str = request_sess(url,headers)
   
    # 输出 JSON 数据中的 key 值为 code 对应的数据
    b = json.loads(json_str)
    print(b['code'])

    
    # 将爬取下来的 JSON 数据保存到本地
    with open(path,'w') as f:
         json.dump(b,f)
    # ********** End ************** #

爬虫实战------网页抓取及信息提取

第1关:利用URL获取超文本文件并保存至本地
任务描述

当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的url,例如在地址栏中输入百度搜索网站的首页url百度一下,你就知道 ,点击确认后,浏览器将向服务器发出一个对该网的请求;服务器端收到请求后,会返回该网页的超文本文件,浏览器收到服务器端发来的网页超文本文件后,对其进行解析,然后在窗口中显示该超文本文件对应的网页。如下图所示。

复制代码
# -*- coding: utf-8 -*-
import urllib.request as req
import os
import hashlib
 
# 国防科技大学本科招生信息网中录取分数网页URL:
url = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/index.htm'  # 录取分数网页URL
 
 
def step1():
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 1.将网页内容保存到data
    x = req.urlopen(url)
    date = x.read()
 
 
 
# 2.将data以二进制写模式写入以学号命名的 "nudt.txt" 文件:
    with open('nudt.txt','wb') as f:
        f.write(date)
 
 
    
#********** End **********#
第2关:提取子链接
任务描述

上一关我们学习了如何访问给定的网页并保存信息到本地,本关我们要从上一关访问的网页中提取出嵌套的url地址,即实现子链接的提取。

复制代码
# -*- coding: utf-8 -*-
import urllib.request as req
# 国防科技大学本科招生信息网中录取分数网页URL:
url = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/index.htm'  # 录取分数网页URL
webpage = req.urlopen(url)  # 按照类文件的方式打开网页
data = webpage.read()       # 一次性读取网页的所有数据
data = data.decode('utf-8')  # 将byte类型的data解码为字符串(否则后面查找就要另外处理了)
 
def step2():
    
# 建立空列表urls,来保存子网页的url
    urls = []
 
# 请按下面的注释提示添加代码,完成相应功能
#********** Begin *********#
# 从data中提取2014到2021每一年分数线子网站地址添加到urls列表中
    for i in range(2014,2021+1):
        string = f"{i}年录取分数统计"
        index = data.find(string)
        urls.insert(0,'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/'+'"'+
        data[index-133:index-133+36])
 
 
# #********** End **********#
    return urls
第3关:网页数据分析
任务描述

下图是2016年国防科技大学分数线的网页,在浏览器中我们可以看到,各省的最高分、最低分、平均分都整齐地排列自在表格中。一个网页的源代码时常有成百上千行,其中很多代码都是为了布局页面样式服务的,而我们时常关心的是网页上的数据,而并不关心样式代码。所以如何从冗长的网页源代码中提取我们关心的数据,是这一关我们将要一起学习和体验的内容。

复制代码
# -*- coding: utf-8 -*-
import urllib.request as req
import re
 
# 国防科技大学本科招生信息网中2016年录取分数网页URL:
url = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/6a4ee15ca795454083ed233f502b262b.htm'
 
webpage = req.urlopen(url)      # 根据超链访问链接的网页
data = webpage.read()           # 读取超链网页数据
data = data.decode('utf-8')     # byte类型解码为字符串
 
# 获取网页中的第一个表格中所有内容:
table = re.findall(r'<table(.*?)</table>', data, re.S)
firsttable = table[0]           # 取网页中的第一个表格
# 数据清洗,将表中的&nbsp, ,和空格号去掉
firsttable = firsttable.replace('&nbsp;', '')
firsttable = firsttable.replace(' ', '')
firsttable = firsttable.replace(' ', '')
 
 
def step3():
    score = []
# 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。
#********** Begin *********#
# 1.按tr标签对获取表格中所有行,保存在列表rows中:
    rows = re.findall(r'<tr(.*?)</tr>', firsttable, re.S)
 
    
    
# 2.迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表:
    count = 0
    for i in rows:
        count += 1
        if count == 1 or count == 2:
            continue
        item = []
        tds = re.findall(r'<td(.*?)</td>', i, re.S)
        count2 = 0
        for j in tds:
            count2 += 1
            p = re.findall(r'<p(.*?)</p>', j, re.S)
            if count2 == 1:
                sf = re.search(r'[一-龥]+', p[0]).group(0)
                item.append(sf)
            elif count2 == 8:
                break
            else:
                try:
                    fs = re.search(r'[1-9]d*', p[0]).group(0)
                    item.append(fs)
                except:
                    item.append('/')
    
# 3.将由省份,分数组成的8元列表(分数不存在的用/代替)作为元素保存到新列表score中,不要保存多余信息
        score.append(item)
 
    
    
#********** End **********#
    
    return score
相关推荐
识君啊2 小时前
中小厂数据库事务高频面试题
java·数据库·mysql·隔离级别·数据库事务·acid
当时只道寻常2 小时前
Vue3 集成 NProgress 进度条:从入门到精通
前端·vue.js
kyriewen2 小时前
React性能优化:从“卡成狗”到“丝般顺滑”的5个秘诀
前端·react.js·性能优化
米丘2 小时前
Vue 3.x 单文件组件(SFC)模板编译过程解析
前端·vue.js·编译原理
helloweilei2 小时前
Web Streams 简介
前端·javascript
悟空瞎说2 小时前
Flutter热更新 Shorebird CodePush 原理、实现细节及费用说明
前端·flutter
didadida2622 小时前
从“不存在”的重复请求,聊到 Web 存储的深坑
前端
xiaominlaopodaren2 小时前
Three.js 渲染原理-透明渲染为什么这么难
前端