目录
本关任务:掌握 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 ***************** #
本关任务:利用 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 请求网页的程序。
- 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
本关任务:使用 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
本关任务:在 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)
本关任务:使用 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 解析爬虫数据的小程序。
- 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 ************** #
当我们想要在浏览器中打开一个网页时,需要在浏览器的地址栏中输入该网页的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 **********#
上一关我们学习了如何访问给定的网页并保存信息到本地,本关我们要从上一关访问的网页中提取出嵌套的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
下图是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'
', data, re.S)- firsttable = table[0] # 取网页中的第一个表格
- # 数据清洗,将表中的 ,\u3000,和空格号去掉
- firsttable = firsttable.replace(' ', '')
- firsttable = firsttable.replace('\u3000', '')
- firsttable = firsttable.replace(' ', '')
-
-
- def step3():
- score = []
- # 请按下面的注释提示添加代码,完成相应功能,若要查看详细html代码,可在浏览器中打开url,查看页面源代码。
- #********** Begin *********#
- # 1.按tr标签对获取表格中所有行,保存在列表rows中:
- rows = re.findall(r'
', 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'
', i, re.S)- count2 = 0
- for j in tds:
- count2 += 1
- p = re.findall(r'
'
, j, re.S) - if count2 == 1:
- sf = re.search(r'[\u4e00-\u9fa5]+', 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
-
相关阅读:
基于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