小言_互联网的博客

相对舒适的爬虫入门系列(二):试着扒首小诗下来可好【Beautifulsoup库+css选择器+保存本地】

397人阅读  评论(0)

回顾:上回我们配置好了初始环境(装好软件),(随手)找了个趁手的IDLE(敲代码的框框儿),学会了装酷(库),并用requests库访问并获取了百度、京东/淘宝站点,看到首页的一坨坨乱糟糟的编码;今天我们尝试整点干净的数据,并将其保存到文件中。

(PS:这儿默认上回后,咱已经挑好并学会自己用的IDLE-写代码的框儿啦)

一、一碗汤的功夫把它扒下~

上回我们使用了可以向站点发起访问请求的requests库,今天的主角儿是BeautifulSoup库(叫我 美 丽 汤~),是一个常用来解析网页编码的库,大白话就是用它可以把上回“print(html.text)”后拿到的那一大坨乱糟糟的代码整理成规整、易处理的编码结构。


  
  1. import requests
  2. from bs4 import BeautifulSoup #从bs4(美丽汤缩写)调用让(乱糟糟)代码 变美丽的 美丽汤库~

(PS:如果报错没这个库(美丽汤),那你应该先用上回介绍的方法,安装好 beautifulsoup4库先哦~提示conda或pip...你应该要会了的哦!)

预导入了要用到的俩库后,明确一下咱要扒的目标,就是下面这个站点内正文内容的一首小诗~

https://www.python.org/dev/peps/pep-0020/ 

先是熟悉的配方(操作),定义好目标连接,发起访问请求,看一下访问状态稳不:


  
  1. url= 'https://www.python.org/dev/peps/pep-0020/'
  2. html=requests.get(url)
  3. html

得到response是200开头(连接访问成功),随即开始新把戏:

(为了方便浏览,我把新把戏对应的代码注释放在后面,每行是一一对应滴~ )


  
  1. soup=BeautifulSoup(html.text, 'lxml')
  2. items=soup.select( '#the-zen-of-python > pre')
  3. items
  4. #上回最后乱糟糟的编码就是'html.text',我们把它丢进美丽汤函数中,用'lxml'这个方法来整理,保存在自起名为soup的变量中
  5. #然后对获得的这个soup变量,使用它的select方法,并把其css参数(??随后揭晓~)放进引号内
  6. #然后你就能得到这段文字的正文内容啦~

(PS:你还可以敲一下"soup",看看咱定义的这个变量,也就是美丽汤魔法后的成果是啥样的哈,应该不再是一大坨,好歹一眼看还分了好多行~哈哈~

另外,没有预装lxml库的话,会报错哈,请pip或conda安装一下~)

↓可以看到结果内容出来了,虽然还是有瑕疵,比如标题不在内,首尾还有些奇怪的编码(图顺便又暴露了楼主随手拎着用的IDLE了嘿嘿~)

到这里,咱们算是一碗汤的功夫把这首小诗拿下了!(:完结,回见!)

等一下!

↓天真脸:这三行新的代码究竟是什么鬼!我知道'html.text'是网页的编码内容,用啥美丽汤整理了一下后存进了"soup"这个你自己定义的变量里,然后后面都啥呢?还有那个’lxml’是啥玩意??


  
  1. soup=BeautifulSoup(html.text, 'lxml')
  2. items=soup.select( '#the-zen-of-python > pre')
  3. items

认真脸(一个个来哈~):

上回我们已经见过'html.text',也就是网页的编码以文本(text)形式直接呈现(乱成一坨嘿嘿),用美丽汤函数就可以把它规整起来,那么,我们用哪种规则来将其规整呢,这里用的就是'lxml'这种方法啦~

为啥要把编码规整化呢?-因为我们往往是要爬取网页内特定的文字或图片等信息,把所有内容统统搬下来的话...(试试全选复制哈哈)~开玩笑哩,这里是说我们只要特定的内容,就需要经过一个特定信息内容提取的过程,首先要选用一个方法,然后沿用这个方法定位我们要的内容~

咱这里选用的是css选择器作为信息提取的方法,与其同级的还有正则表达式、Xpath等定位信息方法(可以搜索起来哩~)

而使用css选择器的路线,可以方便的用美丽汤函数下的‘lxml’方法来统一实现~于是你就能得到 规整后、但仍未做特定内容选取的网页代码片段了(不妨敲soup看看?)

items=soup.select('#the-zen-of-python > pre') 

之后就是对特定内容进行选取的过程了,从第二行代码字面上好理解:对手里这碗汤进行选择...选的是引号里面的一段参数——问题来了,参数咋弄来的呢?它的编码意思,应该就是代表那段小诗正文部分。

参数从这里来哒~

第一步:打开chrome浏览器,并进入目标站点(我用的其实是edge浏览器嘿嘿,都行叭其实~不过我倒是发现edge右侧的操作台都是中文的哩,新手来说貌似有点儿友好~)

https://www.python.org/dev/peps/pep-0020/ 

第二步:窗口滑动到小诗正文区域,3!2!1!,先摁个F12,然后齐摁下“Ctrl+Shift+c”仨键

窗口会先变这样↑(F12后),然后你会发现鼠标有了膜法↓(三键齐摁后):

一方面随着光标移动到目标区域,(①)相关区域会被选中(可以从背景颜色变化观察到,并且上方会有一个小区域的,颜色字体等编码说明,先不管哈);

另外,在右侧(或者可能在下边)的一行行代码结构中,有一行(②)会被相应的突出显示,这一行对应的就是你光标选取的目标区域啦~

你还可以把这行代码(②)最前面的小箭头点一下展开-如果有的话,你就能看到隐藏的更多子内容,并且你在右侧区域选中的代码行,左侧的网页选定区域也会相应动态变化(看到这行代码里面藏的诗了吧~)

PS:其实到这里时,你可以直接在右侧代码区,点击目标文本内容(小诗),右键...复制...就完事了~嘿嘿

啊不,我就要在IDLE里得到它-这篇小诗!

items=soup.select('#the-zen-of-python > pre')

也就是说,这时候我们就想拿到 前面进行特定内容选择的——那个css选择器【参数】(引号内容↑),通过对目标代码行这样操作:

代码行,注意 不是具体的 文字/正文内容,选中摁右键-Copy-Copy selector,三连~

回到IDLE,在soup的select方法的括号里的引号里,粘贴,你就会看到有那段神奇的参数出来了~

到这里,你应该明白了后面新的三行代码的用意哩:先用美丽汤加lxml配方对 网页文本规整化,然后选定截取目标内容(以css选择器参数的 形式表达 要截取的部分),最后输出得到目标内容啦~


  
  1. import requests
  2. from bs4 import BeautifulSoup
  3. url= 'https://www.python.org/dev/peps/pep-0020/'
  4. html=requests. get(url)
  5. html
  6. soup=BeautifulSoup(html. text, 'lxml')
  7. items=soup. select( '#the-zen-of-python > pre')
  8. items

二、趁着汤还没凉,把小诗存下来叭~ 

先把代码段满上:


  
  1. file= r'C:\Users\lgb11\Desktop\xiaoshi.txt' #1)先定义一个文件路径
  2. content=items[ 0].text #2)从定位好的小诗部分内容中,提取我们只需要的文本内容(text)
  3. with open(file, 'w') as f: #3)打开目标文件路径(file),向其写入定义的内容(content)
  4. f.write(content)

(PS:在目标路径后续加的“xiaoshi.txt”,是我新命名的用来存小诗的记事本文件(.txt),名字咱就给它起为“xiaoshi”哩~)

这部分应该都蛮好理解的,不过有些小细节可以提一下:

1)在file后面的引号内容前,咱加了个r-转义字符,可以把win系统目录符号的右斜杠'\'转成可被编码识别的符号,因为在python编码中,是不识别win系统默认的右斜杠'\'(会报错滴哈),这是第一种解决方式;

第二种就是在原来的系统路径的每一个右斜杠'\'符号前都再加一个右向斜杠/-转义字符,表示将每个右向斜杠符号逐一转为能被编码识别右向斜杠符号;两种转义字符,r加在引号前,故作用于引号内所有特殊字符,而在‘/’符号前加/,仅把/转义符 后面的一个'/'符号转义为可识别哦~

最后一种就是手动把右向斜杠符号自己逐一换成左向斜杠啦~


  
  1. #这是win系统默认路径表示,我随便查看桌面一个文件属性-位置,复制过来的
  2. C:\Users\lgb11\Desktop
  3. #下面三种都是python支持的合法路径形式,注意斜杠符号方向
  4. file= r'C:\Users\lgb11\Desktop\xiaoshi.txt' #引号前加r全转~
  5. file= 'C:\\Users\\lgb11\\Desktop\\xiaoshi.txt' #一个个转哈~
  6. file= 'C:/Users/lgb11/Desktop/xiaoshi.txt' #不转了咱干脆都换了叭!

2)

content=items[0].text

第二行其实是把前面整来的items内容,选了里面的第一部分内容(编码世界从0开始哈~),并且只要这些内容里的文本(text)

为什么要这么写呢?-其实里面还有这样一个小小的过程:


  
  1. file= r'C:\Users\lgb11\Desktop\xiaoshi.txt'
  2. with open(file, 'w') as f: #报错警告一次!
  3. f.write(items)
  4. type(items) #喵一下items是啥类型,看为啥不给咱把这种类型写进去!

直接f.write(items),会提示报错,说只能写入str(字符串内容),你这个list(列表)不行滴~这时我们可以用type()方法看一下前面得到的items变量的类型,是列表(list)类型;

之所以items会是list呢,其实是美丽汤的select方法默认返回一个列表(list),里面都是一些编码标签内容(tag),这两种类型都不是 能够直接写入的字符串内容(str)。

其实查看一下items的内容,里面就只有一个<pre>标签(用俩瓣 包起了正文内容,我们要的也就是包住的正文文本,而能直接写入目录txt文件的,也只是中间的文本(类型为str),而包含文本的标签(tag),或者整个包含标签的列表(items),都不能直接写的哦)


  
  1. file= r'C:\Users\lgb11\Desktop\xiaoshi.txt'
  2. with open(file, 'w') as f: #报错警告俩次!
  3. f.write(items[ 0])
  4. type(items[ 0]) #喵一下items[0]是啥类型,竟然还是不行!

也就是说我们在尝试直接写入items失败后(不接受其list类型这样的属性),先把items(这个list)里面的第一个内容取出来(其实里面也只有一个内容哈哈~),再去写入items[0],结果还是失败(不接受其tag类型的属性),items[0]其实就是原来列表内的那一个包着文本的标签啦(一个它 有俩瓣哦),但标签(tag)人家还是不认!咱就加上.text-就说我要你这瓣标签里面的文本内容,只要文本内容啊!

试一下,终于可以写进去了!定义个content变量把它存起来叭~


  
  1. file= r'C:\Users\lgb11\Desktop\xiaoshi.txt'
  2. content=items[ 0].text
  3. with open(file, 'w') as f:
  4. f.write(content)

 成功后会返回写入的字数,并且桌面或咱自己定义的那个目录里,即刻就生成了咱自己起名的一个记事本文件,里边的内容就是————小诗啦!!(第二轮完结撒花~~)

PS小结:最后再把本篇的代码都抡在这,我们主要使用了新的美丽汤库(规整网页编码),并用浏览器里的魔法获取了我们想要的小诗内容的编码参数(浏览器获得目标内容的css选择器参数);

之后我们进行了爬取内容保存在本地的操作,要注意的是路径里的符号(需要转义或替换);然后尝试了解了一些python数据类型(我们把列表-list类型里的标签-tag类型里的文本-text,即str字符类型内容提取了出来。三连操作,list里取tag,tag里取str,套娃似的😓~),

最后用with open方法打开定义好的file-文件路径,以写入的方式-'w'(write的缩写啦)进行,打开后的路径文件随便起个外号,叫它 f 好了,然后向f里写入取出来的字符串内容(也给起了个外号叫 content哈)。一波操作下来,感觉...还行叭哈哈!!


  
  1. import requests
  2. from bs4 import BeautifulSoup
  3. url= 'https://www.python.org/dev/peps/pep-0020/'
  4. html=requests.get(url)
  5. html
  6. soup=BeautifulSoup(html.text, 'lxml')
  7. items=soup.select( '#the-zen-of-python > pre')
  8. items
  9. file= r'C:\Users\lgb11\Desktop\xiaoshi.txt'
  10. content=items[ 0].text
  11. with open(file, 'w') as f:
  12. f.write(content)

最后抱歉,第二篇相对有点长,其实代码量就十行多一点↑,希望能讲明白,如果觉得啰嗦了也还没能看明白,我的锅😓~没理解的代码或关键词,咱搜点资料再深入叭~


转载:https://blog.csdn.net/weixin_44178502/article/details/105630882
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场