本文以中国大学mooc北理老师课程为基础
先贴源代码,之后一一解释。
这个代码就是获取一下网页的大学排名,然后再输出一下,这个简单代码主要有三块内容,rquests,BeautifulSoup,print的一些中文格式处理,下文我也将这样介绍
import requests
from bs4 import BeautifulSoup
import bs4
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u=ulist[i]
print(tplt.format(u[0],u[1],u[2],chr(12288)))
def main():
uinfo = []
url = 'https://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html'
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20) # 20 univs
main()
一:先来看第一个函数getHTMLText(url),与其中重要的request
在http的协议中
- get:获取url位置资源
- head:获取资源的头部信息
- post:想在url位置资源后再加新的数据(发送字典,会默认存储到表单字段)
- put:存储一个资源,覆盖掉原来的数据
- patch:局部更新url位置的资源,改变部分内容(节省带宽)
- DELETE:删除URL位置资源
request是爬虫最基本的一个库,request主要其实就是对应HTTP协议对资源的7操作构建了7个方法
request,get,head,post,put,patch,delete
request的三个参数与作用,之后会介绍现在还用不上
其最常用的方法便是request.get方法,目的是向服务器请求,构造一个request对象,返回来一个页面所有的资源与信息存储到response里(即服务器返回的所有信息)
如request.get("https://www.baidu.com/") r=Request.get("https://www.baidu.com/")
r便存储了Request.get返回的reponse对象
r(reponse对象)有几个常用的属性
- r.status_code 看看连成功没,是200成功,其他的都失败
- r.text 把这个页面以字符串打印出来
- r.encoding 根据header定编码格式
- r.apparent_encoding 根据内容猜测这个网页的编码是啥
- r.content 内容是二进制
第一个函数是一个通用框架,代码中我们用r.raise_for_status()方法,它就可以有效的判断网络连接的状态。如果网连接出现错误,那么它就会用try-except来获取一个异常。而这个异常,在异常部分,我们用了一句 return “产生异常” 来表示,我们捕获到了这个异常。总之,这个函数获取了网页的返回的HTML文本
二:上文第二个函数 fillUnivList(ulist, html),与其中的BeautifulSoup
我们通常访问的网页代码都是<p class="title">.....</p>这样的格式,这个整体叫tag(标签),p是个名称(name),除了class这个属性(Attributes),p还有很多其他属性,就不列举,属性是由键值对构成的
BeautifulSoup对应于我们上边所说的HTML的标签有着对应的类的基本元素
Tag,Name,Attributes,NavigableString(这个是标签内的String文本),Comment(标签的注释)
BeautifulSoup库使用时常用的格式为:
from bs4 import BeautifulSoup
实际上HTML文档=标签数=Beatuifulsoup,Beautifulsoup类将HTML文档抽象为一个类。之后就可以对这个HTML文档为所欲为了,要解析HTML文档还需要一个解析器,这需要用cmd输入
pip install lxml
来安装lxml解析器,也有其他的解析器,好像网上大都用这个
然后就可用BeautifulSoup进行解析,代码如下
import requests
from bs4 import BeautifulSoup
re=requests.get("https://blog.csdn.net/")
bs=BeautifulSoup(re.text,"lxml")
发现了个问题:
这个返回来的re.text的竟然是空的,肯定是CSDN做了初级的反爬虫的策略,然鹅就这初级的反爬虫我解决不,希望评论区有大佬帮我解决,此章暂时略过,之后还是以https://www.baidu.com/为例吧,太难了
import requests
from bs4 import BeautifulSoup
import bs4
re = requests.get("https://www.baidu.com/")
bs = BeautifulSoup(re.text , "lxml")
print(bs.a)
print (bs.a.parent)
print(bs.a.name)
print (bs.a.parent.name)
print(type(bs.a))
看了一下其他的属性,还有bs.a.attrs,可以获取标签的属性,忘了打了
上个代码的输出
上面的输出如此之乱如何让变得更加符合人的阅读呢??https://baijiahao.baidu.com/s?id=1663044686334575715&wfr=spider&for=pc
这就有了bs4库中的prettify()可以让其输出更漂亮。
大致就变成这个样子,其实就加了个/n
爬虫终究要进行提取,总不能直接爬个HTML文本吧,所以要进行信息提取,下面是信息提取的一般方法:解析加搜索:找标签——>提取内容,主要方法find_all()
所以第二个函数的意义就呼之欲出了
#判断是否是Bs4中的tr标签
if isinstance(tr,bs4.element.tag)
#将1,2,3作为一个整体添加到列表里
ulist.append(1,2,3)
所以这第二个函数就是将数据保存到一个这个列表里然后再返回
三:第三个函数printUnivList(ulist, num):打印
其实没啥好讲的,主要是中文字符如何对齐与槽的输出用{}与format配合来进行输出,导致这个结果的原因是因为中文字符用英文来填充所以中间对齐有些问题
所以进行中文对齐改进
tplt="{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名","学校名称","总称",chr(12288)))
这个代码意思还是从网上查了查,0,1,2,3与参数对饮,我们注意第{1:{3}^10}括号1是指“学校总称”,3是指中文空格填充,总的来说就是这样啦,写了一天也算有些收获
PY1:https://baijiahao.baidu.com/s?id=1663044686334575715&wfr=spider&for=pc
vscode安装后想让python有自动补全,搞了好久,发现一个关键问题,上面地址是个解决方法
好吧除了这个还有很多问题,最关键的是python lanuage serve的设置那里,我尝试了三个,发现pylance是最好的
PY2:信息标记的三种形式:
- XML:与HTML非常相似,举个例子:<img src="china.jpg" size="10">..</img>
- JSON: 使用键值对来传递信息(有类型键值对):举例(有三种方式):"name":"中国地质大学" 此例子中"name"为键,中国地质大学为value,双引号表字符串,数字则不用加"",也可"name":["中国地质大学","北京语言大学"],,,,,也可以嵌套使用 "name":{ "newName":"北京大学","oldname":"大佬"}
- YAML:无类型键值对 如 name:中国地质大学 嵌套如何表示呢??用缩进来表示
name:
Newname:北京
oldName:首都