每天30分钟 一起来学习爬虫——day11(解析数据 之 bs4,实例:爬取北京市企业大全)


BeautifulSoup 简介

这个简写 bs 现在都是bs4,bs3 已经停止开发了,可以看看官方文档

BeautifulSoup,就是一个第三方的库,使用之前需要安装
pip install bs4,这里还是切换国内源的问题,按之前我的博客里配置好的就不用管了。

使用方法

form bs4 import BeautifulSoup

可以将一个html文档 转化为指定对象,然后通过对象的方法或属性去查找指定的内容:

  1. 转化本地文件;
    soup = BeautifulSoup(open(‘本地文件’),‘lxml’)
  2. 转化网络文件:
    soup = BeautifulSoup(‘字符串类型或字节类型’,‘lxml’)

​这里,lxml是解析库,一般默认的就是调用系统中的解析库

  • (1) 根据标签名查找

soup.a 只能找到第一个a标签

  • (2) 获取属性

soup.a[‘herf’] 类似于字典的获取方法
soup.a.attrs 这个以字典的形式返回所有的属性

  • (3) 获取内容

soup.a.string
​ soup.a.text
​ soup.a.get_text()
soup.a.get(‘herf’) a 的 herf 属性
注意: 当标签里面还有标签的时候,string获取的为None,其他两个获取纯文本内容

  • (4) find

soup.find(‘a’, title=‘qing’) 找title 是qing的 a
soup.find(‘a’)
find只能找到符合要求的第一个标签,他返回的是一个对象

  • (5)find_all

soup.find_all([‘a’, ‘b’])
返回一个列表,列表里面是所有的符合要求的对象

  • (6)select

根据css选择器选择知道内容
​ 常见的选择器:
标签选择器,类选择器,id选择器,组合选择器,层级选择器伪类选择器,属性选择器
​ select 返回的永远是列表,列表里是对象,要用下标来访问指定的对象,然后获取 属性 和 内容。
select(’.sist‘) 找到所以类名为 sist 的标签。
select('#one') 找到 id 为 one 的标签
select('head title') 后代你选择,head 下面的 title
select('title,.title')祖选择器,
select('a[id="link3"]')属性选择器

注意:find find_all select不仅适用于soup对象,还适用于其他的子对象,如果调用子对象的select方法,那么就是从这个子对象里面去找符合这个选择器的标签

实例 : 爬取 北京市企业大全

开始是要爬取 智联招聘就是这个网站
但突然发现 有点麻烦,这个后面再讲吧,这里主要是学会 bs4 解析页面。

下面我们爬取 北京企业名称。这次封装一个对象来写程序,顺便复习一下python

在这里插入图片描述
我们容易发现页码的规律,然后,找一找bs4要解析的标签。

在这里插入图片描述

一个a标签,下面还有一个 b 标签,我们可以先找到所有的a 再循环找b并取出内容

import requests
from bs4 import BeautifulSoup

class ZhiLianSpider(object):
    # init方法,叫做初始化方法,本质上就是一个函数
    # 当实例化对象时 ,就会自动执行 init方法 将对象作为第一个参数传入,参数名称位self,self是可以更改的但是不建议!
    # 功能:用户给对象附初始值
    url = 'http://shop.99114.com/list/area/101101_'  # 这是类属性
    # 保存成员属性
	def __init__(self, start_page, end_page):
        self.start_page = start_page
        self.end_page = end_page

    # 获取响应
    def get_response(self, p):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
        }
        url_now = self.url + str(p)
        response = requests.get(
            url=url_now, headers=headers).content.decode('utf8')
        return response

    # 解析内容函数
    def parse_txt(self, content):
        soup = BeautifulSoup(content, 'lxml')
        name_list = soup.find_all('a', target="_blank")
        # print(name_list)
        b_list = []
        for a in name_list:
            b = a.find('b')
            b_list.append(b)
        for b in b_list:
            if b is not None:
                #print(b)
                with open ('ll.txt' , 'a',encoding='utf8') as f:
                    f.write(b.text+'\n')

    # 写爬取主程序,
    def run(self):
        for p in range(self.start_page, self.end_page+1):
            # 发送请求,获取响应
            content = self.get_response(p)
            # with open('h.html', 'w', encoding='utf8') as f:
            #     f.write(content)
            # 解析内容
            self.parse_txt(content)

def main():
    start_page = int(input('请输入查询的开始页码:'))
    end_page = int(input('请输入查询的结束页码:'))
    # 创建对象,启动程序:
    spider = ZhiLianSpider(start_page, end_page)
    spider.run()


if __name__ == "__main__":
    main()

这样就爬取好了,这里我们还用了最后说的,find, find_all, select不仅适用于soup对象,还适用于其他的子对象,所以我们先找到了 a 标签,又找到 b标签,最后对b使用方法text来取出内容。


好啦,直到现在,数据解析也已经差不多学完了,比较一下三种方法,大家可以选一个自己用的舒服的多研究研究。

在这里插入图片描述

下面我们要学的就是数据存储了。只有用合适的方式存储数据才可以更好的使用它。


我又来要赞了啊,如果觉得可以学到些什么的话,点个赞再走吧,

发布了51 篇原创文章 · 获赞 53 · 访问量 4165

猜你喜欢

转载自blog.csdn.net/weixin_45691686/article/details/105098179