一周目,爬虫,六日

bs4模块

1  bs4简介

bs4全名  Beautiful Soup4

是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式

2  基本使用

1    构造一个解析对象
soup = BeautifulSoup(爬取的文件, 解析器)解析器一般使用'lxml'
2     常用内置方法
soup.a            #  查找第一个a标签的内容
soup.p.text     # 获取标签内部的文本
soup.a.attrs     # 以字典的形式,获取标签内部的属性
soup.a.attrs.get('href')=soup.a.get('href')    # 可以简写 省略attrs参数
'''了解补充'''
soup.p.children    # 获取标签内部所有的子标签  需要循环取值才可以拿到
soup.p.contents   # 获取标签内部所有的元素 了解即可
soup.p.parent      # 获取标签的父标签
soup.p.parents     # 获取标签的所有祖先标签

3  bs4进阶

3.1 find与find_all

1.find方法      
缺陷:只能找符合条件的第一个  该方法的返回结果是一个标签对象
soup.find(name='a')     
# 查找指定标签名的标签 默认只找符合条件的第一个
soup.find(name='a',id='link2')  
# 查找具有某个特定属性的标签 默认只找符合条件的第一个
soup.find(name='p', class_='title')
 # 为了解决关键字冲突 会加下划线区分
soup.find(name='p', attrs={'class': 'title'})
# 还可以使用attrs参数 直接避免冲突,并且class使用成员运算
soup.find(attrs={'class': 'c1'})
#    name参数不写默认放宽至所有标签
2.find_all方法  
优势:查找所有符合条件的标签  该方法的返回结果是一个列表
内置方法与find相同,返回的结果是一个列表

3.2  css选择器

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

print(soup.select('.title'))  # 查找class含有title的标签
# print(soup.select('.sister span'))  # 查看class含有sister标签内部所有的后代span
# print(soup.select('#link1'))  # 查找id等于link1的标签
# print(soup.select('#link1 span'))  # 查找id等于link1标签内部所有的后代span
# print(soup.select('#list-2 .element'))  # 查找id等于list-2标签内部所有class为element的标签
# print(soup.select('#list-2')[0].select('.element')) #可以一直select,但其实没必要,一条select就可以了

 爬取北京新发地数据

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)

爬取红牛地址

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]))

 

posted @ 2021-09-21 21:06  aa_wang  阅读(30)  评论(0)    收藏  举报