• 头歌答案--爬虫实战


    目录

    urllib 爬虫 

    第1关:urllib基础

    任务描述

    第2关:urllib进阶 

    任务描述

    requests 爬虫

    第1关:requests 基础

    任务描述

    第2关:requests 进阶

    任务描述

    网页数据解析

    第1关:XPath解析网页 

    任务描述

    第2关:BeautifulSoup解析网页 

    任务描述

    JSON数据解析

    第1关:JSON解析 

    任务描述

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

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

    任务描述

    第2关:提取子链接 

    任务描述

    第3关:网页数据分析 

    任务描述


    urllib 爬虫 

    第1关:urllib基础

    任务描述

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

    1. import urllib.request
    2. def request(url):
    3. '''
    4. 一个参数
    5. :param url:请求网址
    6. :return:返回一个请求的字符串。编码为utf-8
    7. '''
    8. # *************** Begin *************** #
    9. r=urllib.request.urlopen(url)
    10. return r.read().decode('utf-8')
    11. # *************** End ***************** #

    第2关:urllib进阶 

    任务描述

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

    1. import urllib.request
    2. import http.cookiejar
    3. def request(url,headers):
    4. '''
    5. 两个参数
    6. :param url:统一资源定位符,请求网址
    7. :param headers:请求头
    8. :return:html
    9. '''
    10. # ***************** Begin ******************** #
    11. cookie = http.cookiejar.CookieJar()
    12. handler = urllib.request.HTTPCookieProcessor(cookie)
    13. opener = urllib.request.build_opener(handler)
    14. r= opener.open(url)
    15. # ***************** End ******************** #
    16. html = r.read().decode('utf-8')
    17. return html

    requests 爬虫

    第1关:requests 基础

    任务描述

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

    1. import requests
    2. def get_html(url):
    3. '''
    4. 两个参数
    5. :param url:统一资源定位符,请求网址
    6. :param headers:请求头
    7. :return:html
    8. '''
    9. # ***************** Begin ******************** #
    10. # 补充请求头
    11. headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/"
    12. "537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
    13. # get请求网页
    14. response = requests.get(url=url, headers=headers) # 模拟登录请求
    15. response.encoding = "utf-8" # 定义编码
    16. # 获取网页信息文本
    17. html = response.text
    18. # ***************** End ******************** #
    19. return html

    第2关:requests 进阶

    任务描述

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

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

    网页数据解析

    第1关:XPath解析网页 

    任务描述

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

    1. import urllib.request
    2. from lxml import etree
    3. def get_data(url):
    4. '''
    5. :param url: 请求地址
    6. :return: None
    7. '''
    8. response=urllib.request.urlopen(url=url)
    9. html=response.read().decode("utf-8")
    10. # *************** Begin *************** #
    11. parse = etree.HTML(html)
    12. # 写入xpath路径
    13. item_list = parse.xpath("//div[@class='left']/ul/li/span/a/text()")
    14. #item_list = parse.xpath("/html/body/div[2]/div[1]/ul/li/span/a.text()")
    15. # *************** End ***************** #
    16. print(item_list)

    第2关:BeautifulSoup解析网页 

    任务描述

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

    1. import requests
    2. from bs4 import BeautifulSoup
    3. def get_data(url, headers):
    4. '''
    5. 两个参数
    6. :param url:统一资源定位符,请求网址
    7. :param headers:请求头
    8. :return data:list类型的所有古诗内容
    9. '''
    10. # ***************** Begin ******************** #
    11. response = requests.get(url, headers=headers)
    12. response.encoding = "utf-8"
    13. html = response.text
    14. soup = BeautifulSoup(html, 'lxml')
    15. data = soup.find('div', {'class': 'left'}).ul.find_all('li')
    16. data = [i.p.text for i in data]
    17. # ****************** end ********************* #
    18. return data

    JSON数据解析

    第1关:JSON解析 

    任务描述

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

    1. import urllib.request
    2. from lxml import etree
    3. import http.cookiejar
    4. import json
    5. def request_sess(url,headers):
    6. cj=http.cookiejar.CookieJar()
    7. opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    8. request = urllib.request.Request(url=url, headers=headers)
    9. r=opener.open(fullurl=request)
    10. html = r.read().decode('utf-8')
    11. return html
    12. def save_data(path):
    13. '''
    14. :param path: 文件保存路径
    15. :return: 无
    16. '''
    17. url='http://127.0.0.1:8080/index'
    18. headers={
    19. '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'
    20. }
    21. # ********** Begin ************** #
    22. json_str = request_sess(url,headers)
    23. # 输出 JSON 数据中的 key 值为 code 对应的数据
    24. b = json.loads(json_str)
    25. print(b['code'])
    26. # 将爬取下来的 JSON 数据保存到本地
    27. with open(path,'w') as f:
    28. json.dump(b,f)
    29. # ********** End ************** #

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

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

    任务描述

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

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

    第2关:提取子链接 

    任务描述

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

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

    第3关:网页数据分析 

    任务描述

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

    1. # -*- coding: utf-8 -*-
    2. import urllib.request as req
    3. import re
    4. # 国防科技大学本科招生信息网中2016年录取分数网页URL:
    5. url = 'https://www.nudt.edu.cn/bkzs/xxgk/lqfs/6a4ee15ca795454083ed233f502b262b.htm'
    6. webpage = req.urlopen(url) # 根据超链访问链接的网页
    7. data = webpage.read() # 读取超链网页数据
    8. data = data.decode('utf-8') # byte类型解码为字符串
    9. # 获取网页中的第一个表格中所有内容:
    10. table = re.findall(r'', data, re.S)
    11. firsttable = table[0] # 取网页中的第一个表格
    12. # 数据清洗,将表中的 ,\u3000,和空格号去掉
    13. firsttable = firsttable.replace(' ', '')
    14. firsttable = firsttable.replace('\u3000', '')
    15. firsttable = firsttable.replace(' ', '')
    16. def step3():
    17. score = []
    18. # 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。
    19. #********** Begin *********#
    20. # 1.按tr标签对获取表格中所有行,保存在列表rows中:
    21. rows = re.findall(r'', firsttable, re.S)
    22. # 2.迭代rows中的所有元素,获取每一行的td标签内的数据,并把数据组成item列表,将每一个item添加到scorelist列表:
    23. count = 0
    24. for i in rows:
    25. count += 1
    26. if count == 1 or count == 2:
    27. continue
    28. item = []
    29. tds = re.findall(r'', i, re.S)
    30. count2 = 0
    31. for j in tds:
    32. count2 += 1
    33. p = re.findall(r'', j, re.S)
    34. if count2 == 1:
    35. sf = re.search(r'[\u4e00-\u9fa5]+', p[0]).group(0)
    36. item.append(sf)
    37. elif count2 == 8:
    38. break
    39. else:
    40. try:
    41. fs = re.search(r'[1-9]\d*', p[0]).group(0)
    42. item.append(fs)
    43. except:
    44. item.append('/')
    45. # 3.将由省份,分数组成的8元列表(分数不存在的用/代替)作为元素保存到新列表score中,不要保存多余信息
    46. score.append(item)
    47. #********** End **********#
    48. return score
  • 相关阅读:
    基于JAVA商品限时秒杀系统计算机毕业设计源码+数据库+lw文档+系统+部署
    新版HBuilderX在uni_modules创建搜索search组件
    数据安全与PostgreSQL:最佳保护策略
    2022.11.11 英语背诵
    Python数据结构(顺序表)
    visual studio 2008 编译项目出现层次不穷问题枚举
    12.Node.js模块化:CommonJS 标准和ECMAScript标准
    腾讯云2023年双十一优惠活动整理汇总
    金仓数据库KingbaseES安全指南--4 数据访问保护
    蓝桥杯算法竞赛系列第十章·nSum问题的代码框架
  • 原文地址:https://blog.csdn.net/m0_62476845/article/details/134358330