头歌答案--爬虫实战

头歌答案--爬虫实战 目录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 函数的使用完成一个简易的爬取程序。import urllib.request def request(url): 一个参数 :param url:请求网址 :return:返回一个请求的字符串。编码为utf-8 # *************** Begin *************** # rurllib.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 htmlrequests 爬虫第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(urlurl, headersheaders) # 模拟登录请求 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:BAIDUID53B7CC4BFCDC39D2EF625C13D285429D:FG1; BIDUPSID53B7CC4BFCDC39D2EF625C13D285429D; PSTM1591665716; BD_UPN12314753; BDUSS2N2ajRYZnI2cVlZN1FRemlWNU9FV1lSZFM3SnZBS0dvRW44WFRCUTRWck1mUVpmR VFBQUFBJCQAAAAAAAAAAAEAAAAoKJzNMTIyMzM4ODQ1uNW41QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAMzw3l7M8N5eS; BDORZB490B5EBF6F3CD402E515D22BCDA1598; sug3; sugstore1; ORIGIN0; bdime0; H_PS_PSSID1456_31672_32139_31253_32046_32230_31708_32295_26350_22160; delPer0; BD_CK_SAM1; PSINO6; H_PS_645EC3b86vFCd303Aw0wmqvkcAGpfxU4oXfwYcs6jRd1RnxihTsvhfqaVB%2BIoeBs; BDSVRTM0 } # 创建Session, 并使用Session的get请求网页 sess requests.session() # 获取网页信息文本 response sess.get(url,headersheaders) response_home sess.get(urlurl) htmlresponse.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 responseurllib.request.urlopen(urlurl) htmlresponse.read().decode(utf-8) # *************** Begin *************** # parse etree.HTML(html) # 写入xpath路径 item_list parse.xpath(//div[classleft]/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, headersheaders) 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 dataJSON数据解析第1关JSON解析任务描述本关任务编写一个能用 JSON 解析爬虫数据的小程序。import urllib.request from lxml import etree import http.cookiejar import json def request_sess(url,headers): cjhttp.cookiejar.CookieJar() openerurllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj)) request urllib.request.Request(urlurl, headersheaders) ropener.open(fullurlrequest) html r.read().decode(utf-8) return html def save_data(path): :param path: 文件保存路径 :return: 无 urlhttp://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,20211): string f{i}年录取分数统计 index data.find(string) urls.insert(0,https://www.nudt.edu.cn/bkzs/xxgk/lqfs/ data[index-133:index-13336]) # #********** 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(rtable(.*?)/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(rtr(.*?)/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(rtd(.*?)/td, i, re.S) count2 0 for j in tds: count2 1 p re.findall(rp(.*?)/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