本文已参与「新人创作礼」活动,一起开启掘金创作之路。
python 爬虫
先总结:
python在爬取的时候:
有注释的js尽量用text,不要用string
网络上对爬虫的定义是这样: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。 传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。 主要的目的就是为了代替人工的操作,在我休息的时候能够不断地对当前我想要爬取的数据进行收集、记录。在数据的保存方面也比较有学问,需要有专门的数据库进行存储、安放。我会在后面讲解完全进行爬虫相关操作的一系列流程。
python爬虫目前我使用到的比较多的就是:
1.面向静态的网页进行爬取
2.面向js进行爬取
在这里,我主要讲的就是读取已经生成的静态网页的网站,之后对js的相关接口进行分析也会继续进行讲解。
本文主要就是讲解在python制作的爬虫中如何处理相关的网页数据,如何应对其中的注释
对于有注释的html文件:
出现了一个好奇怪的现象:
就是再适用bs4的时候,对于之前书本上学到的.text和.string之间的关系,text用于一个大标签中有多个字符串的情况,会返回用空格隔开的一大串字符串;但是string则是再这个情况之下会失灵,对于多个字符串只能返回none
但是在此处,虽然只有一个字符串,但是在字符串中间出现了<!---->这种情况。
我们要格外的注意:
有注释就不能适用string进行爬取,否则会返回none!应该使用text!
同时,text的返回值由于注释的存在会有很多空格,我们用.strip()即可去除
md,今天为了这个试了好久,难受
仔细观察上面的图片:
a开头的就可以适用:string
其他的td就必须用text了
//////////////////////////我是分割线///////////////////////////////////////////////
发表一个爬虫的用法,书上没有教过:
完整示范代码如下:
# coding=utf-8
import requests
from bs4 import BeautifulSoup
import bs4
ulist1=[]
def getHTMLText(url):#获取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):#将html页面放到ulist列表中(核心)
soup = BeautifulSoup(html,"html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr,bs4.element.Tag):#如果tr标签的类型不是bs4库中定义的tag类型,则过滤掉
a = tr('a')
tds = tr('td')#将所有的td标签存为一个列表类型
# print(tds)
ulist.append([tds[0].text.strip(), a[0].string.strip(), tds[4].text.strip()])#11.17更新后代码
print(tds[0].string)
# print(a[0].string)
# print()
#原来代码ulist.append([tds[0].string.strip(),a[0].string.strip(),tds[4].string.strip()])
def printUnivList(ulist1,num):#打印出ulist列表的信息,num表示希望将列表中的多少个元素打印出来
#格式化输出
tplt = "{0:^10}\t{1:{3}^12}\t{2:^10}"
# 0、1、2为槽,{3}表示若宽度不够,使用format的3号位置处的chr(12288)(中文空格)进行填充
print(tplt.format("排名","学校名称","总分",chr(12288)))
for i in range(num):
u = ulist1[i]
print(tplt.format(u[0], u[1], u[2],chr(12288)))
print()
print("共有记录"+str(num)+"条")
def main():
uinfo = [] #将大学信息放到列表中
url = "https://www.shanghairanking.cn/rankings/bcur/2020"
html = getHTMLText(url)
fillUnivList(uinfo,html)
printUnivList(uinfo,10)
main()
加油!