目录

  • 爬虫题讲解
  • bs4模块
  • 爬取红牛分公司数据

爬取北京新发地蔬菜相关数据

思想

1.明确题目需求,获取页面上某一块区域内部的核心数据
2.先查看核心数据的加载方式
3.发现数据并不在网页源码上,说明是内部动态加载的
4.通过network查看发现内部发送了一个post请求
5.post请求最为独特的就是请求体数据,所以需要研究一下

代码演示

Python bs4 代码下载 python bs4模块_获取标签

Python bs4 代码下载 python bs4模块_数据_02

import requests
import time

def get_price_data(n):
    res = requests.post('http://www.xinfadi.com.cn/getPriceData.html',
                        data={
                            "limit": '',
                            "current": n,
                            "pubDateStartTime": '',
                            "pubDateEndTime": '',
                            "prodPcatid": '',
                            "prodCatid": '',
                            "prodName": '',
                        }
                        )
    data_list = res.json().get('list')
    for d in data_list:
        pro_name = d.get('prodName')
        low_price = d.get('lowPrice')
        high_price = d.get('highPrice')
        avg_price = d.get('avgPrice')
        pub_date = d.get('pubDate')
        source_place = d.get('place')
        print("""
        蔬菜名称:%s
        最低价:%s
        最高价:%s
        平均价:%s
        上市时间:%s
        原产地:%s
        """ % (pro_name, low_price, high_price, avg_price, pub_date, source_place))
        time.sleep(1)


"""涉及到多页数据爬取的时候 最好不要太频繁 可以自己主动设置延迟"""
for i in range(1, 5):
    time.sleep(1)
    get_price_data(i)

View Code 

Python bs4 代码下载 python bs4模块_选择器_03

爬虫解析库之bs4模块

全名:Beautiful Soup4
是一个可以从HTML或XML文件中提取数据的Python库
它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式
Beautiful Soup会帮你节省数小时甚至数天的工作时间

模块与配套解析器下载

# pip3 install beautifulsoup4

# pip3 install lxml

Python bs4 代码下载 python bs4模块_Python bs4 代码下载_04

 

 bs4模块基本使用

演示准备

Python bs4 代码下载 python bs4模块_获取标签

Python bs4 代码下载 python bs4模块_数据_02

from bs4 import BeautifulSoup

# 构造一个网页数据
html_doc = """
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
    <body>
        <p class="title">
            <b>The Dormouse's story</b>
        </p>
        
        <p class="story">Once upon a time there were three little sisters; and their names were
        <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
        <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
        <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
        and they lived at the bottom of a well.</p>
        
        <p class="story">...</p>
    </body>
</html>
"""

View Code

如何筛选

# 1.构造一个bs4解析器对象
soup = BeautifulSoup(html_doc, 'lxml')

# 2.利用对象的内置方法完成一系列操作
'''必须要掌握'''
print(soup.a)  # 从上往下的第一个a标签  soup.标签名称

Python bs4 代码下载 python bs4模块_数据_07

 获取标签内部的文本 包含内部所有的后代标签文本

print(soup.p.text)

Python bs4 代码下载 python bs4模块_选择器_08

 获取标签内部所有的属性  字典数据类型

print(soup.a.attrs)

Python bs4 代码下载 python bs4模块_Python bs4 代码下载_09

 获取指定标签内的链接网址

print(soup.a.attrs.get('href'))
print(soup.a.get('href'))  # 可以简写 省略attrs参数

Python bs4 代码下载 python bs4模块_获取标签_10

 获取标签内部所有的子标签 

print(soup.p.children)

Python bs4 代码下载 python bs4模块_获取标签_11

 获取标签内部所有的元素

print(soup.p.contents)

Python bs4 代码下载 python bs4模块_数据_12

 获取标签的父标签

print(soup.p.parent)

Python bs4 代码下载 python bs4模块_选择器_13

 获取标签的所有祖先标签

print(soup.p.parents)

Python bs4 代码下载 python bs4模块_选择器_14

 

 bs4核心操作

1.find方法

# 缺陷:只能找符合条件的第一个  该方法的返回结果是一个标签对象

查找指定标签名的标签 默认只找符合条件的第一个

print(soup.find(name='a'))

Python bs4 代码下载 python bs4模块_选择器_15

查找具有某个特定属性的标签 默认只找符合条件的第一个

print(soup.find(name='a',id='link2'))

Python bs4 代码下载 python bs4模块_Python bs4 代码下载_16

为了解决关键字冲突 会加下划线区分

print(soup.find(name='p', class_='title'))

Python bs4 代码下载 python bs4模块_选择器_17

使用attrs参数 直接避免冲突

print(soup.find(name='p', attrs={'class': 'title'}))
print(soup.find(name='a', attrs={'id': 'link3'}))

Python bs4 代码下载 python bs4模块_数据_18

class属性查找属于成员运算

print(soup.find(name='a', attrs={'class': 'c1'}))

Python bs4 代码下载 python bs4模块_数据_19

name参数不写则表示查找所有符合后续条件的标签

print(soup.find(attrs={'class': 'c1'}))

Python bs4 代码下载 python bs4模块_选择器_20

2.find_all方法

# 优势:查找所有符合条件的标签  该方法的返回结果是一个列表

name字段可以省略 查找的结果是一个列表

print(soup.find_all('a'))

Python bs4 代码下载 python bs4模块_数据_21

 

3.select方法

# 需要使用css选择器  该方法的返回结果是一个列表

演示准备

Python bs4 代码下载 python bs4模块_获取标签

Python bs4 代码下载 python bs4模块_数据_02

"""
<p></p>
<div>
    <a></a>
    <p>
        <a></a>
    </p>
    <div><p></p></div>
</div>
<p></p>
<p></p>

"""

View Code

选择器分类

1.标签选择器
    直接书写标签名即可
2.id选择器
    #d1  相当于写了 id='d1'
3.class选择器
    .c1  相当于写了 class=c1
4.儿子选择器(大于号)  选择器可以混合使用
     div>p  查找div标签内部所有的儿子p
5.后代选择器(空格)    选择器可以混合使用
    div p  查找div标签内部所有的后代p

查找class含有title的标签

print(soup.select('.title'))

Python bs4 代码下载 python bs4模块_数据_24

查看class含有sister标签内部所有的后代span

print(soup.select('.sister span'))

Python bs4 代码下载 python bs4模块_选择器_25

查找id等于link1的标签

print(soup.select('#link1'))

Python bs4 代码下载 python bs4模块_获取标签_26

查找id等于link1标签内部所有的后代span

print(soup.select('#link1 span'))

Python bs4 代码下载 python bs4模块_获取标签_27

查找id等于list-2标签内部所有class为element的标签

print(soup.select('#list-2 .element'))

可以一直select,但其实一条select即可

print(soup.select('#list-2')[0].select('.element'))

爬取红牛分公司数据

需求:获取红牛所有分公司详细数据(名称 地址 邮箱 电话)
    
1.查找数据加载方式 得知是直接加载的
2.朝该网页发送请求获取页面数据之后筛选即可

代码演示

Python bs4 代码下载 python bs4模块_获取标签

Python bs4 代码下载 python bs4模块_数据_02

import requests
from bs4 import BeautifulSoup

# 1.发送get请求获取页面内容
res = requests.get('http://www.redbull.com.cn/about/branch')
# 2.解析页面数据
soup = BeautifulSoup(res.text, 'lxml')
# 3.研究标签特性 精确查找
# 分公司名称数据
h2_tag_list = soup.find_all('h2')  # 查找到所有的h2标签对象
# for tag in h2_tag_list:
# print(tag.text)
# 使用列表生成式
title_list = [tag.text for tag in h2_tag_list]

# 分公司地址数据
p1_tag_list = soup.find_all(name='p', attrs={'class': 'mapIco'})
# for tag in p_tag_list:
#     print(tag.text)
# 使用列表生成式
addr_list = [tag.text for tag in p1_tag_list]

# 分公司邮箱数据
p2_tag_list = soup.find_all(name='p', attrs={'class': 'mailIco'})
# for tag in p2_tag_list:
#     print(tag.text)
email_list = [tag.text for tag in p2_tag_list]

# 分公司电话数据
p3_tag_list = soup.find_all(name='p', attrs={'class': 'telIco'})
# for tag in p3_tag_list:
#     print(tag.text)
phone_list = [tag.text for tag in p3_tag_list]

for i in range(len(title_list)):
    print("""
    公司名称:%s
    公司地址:%s
    公司邮箱:%s
    公司电话:%s 
    """ % (title_list[i], addr_list[i], email_list[i], phone_list[i]))

View Code

Python bs4 代码下载 python bs4模块_数据_30