爬取直接加载的页面
爬取直接加载的页面
作业讲解
爬取北京新发地蔬菜相关数据
我们的需求是获取页面上某一块区域内部的核心数据
第一步 先查看核心数据的加载方式,发现数据并不是在网页源码上的
说明是内部动态加载的
通过network查看发现内部发送了一个post请求
import requests import time def get_price_data(n): res = requests.post('http://www.xinfadi.com.cn/getPriceData.html', data={ 'limit': 20, 'current': n, 'pubDateStartTime': '', 'pubDateEndTime': '', 'prodPcatid': 1186, 'prodCatid': '', 'prodName': '' }) data_dict = res.json() data_list = data_dict.get('list') for l in data_list: pro_name = l.get('prodName') low_price = l.get('lowPrice') high_price = l.get('highPrice') avg_price = l.get('avgPrice') pub_date = l.get('pubDate') source_place = l.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)
爬虫解析库之bs4模块
全名:Beautiful Soup4
是一个可以从HTML或者XML文件中提取数据的python库,它可以通过你喜欢的转化器实现惯用的文档导航,查找,修改文档的方式,Beautiful Soup会帮助你节省数小时甚至数天的工作时间
模块下载
pip3 install beautiful soup4
配套解析器下载
pip3 install lxml
bs4模块基本使用
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>
1.构造一个bs4解析器对象
soup = BeautifulSoup(html_doc,'lxml')
2.利用对象的内置方法完成一系列操作
**必须要掌握**
print(soup.a) 从上往下的第一个a标签 soup.标签名称 print(soup.p.text) 获取标签内部的文本 包含内部所有的后代标签文本 print(soup.a.attrs) 获取标签内部所有的属性 字典数据类型 print(soup.a.attrs.get('href')) print(soup.a.get('href')) 可以简写 省略attrs参数


**了解即可**
print(soup.p.children) 获取标签内部所有的子标签 需要循环取值才能拿到 print(soup.p.contents) 获取标签内部所有的元素 print(soup.p.parent) 获取标签的父标签 print(soup.p.parents) 获取标签的所有祖先标签
bs4核心操作
1.find方法
缺陷:只能找到符合条件的第一个 该方法的返回结果是一个标签对象
# 查找指定标签名的标签 默认只能找到符合条件的第一个 print(soup.find(name='a')) # 查找某个具有某个特定属性的标签 默认只能找到符合条件的第一个 print(soup.find(name='a',id='link2')) # 为了解决关键字冲突 会加下划线区分 print(soup.find(name='p',class_='title')) # 还可以使用attrs参数 直接避免冲突 print(soup.find(name='p',attrs={'class':'title'})) # class属性查找属于成员运算 有就行 print(soup.find(name='a', attrs={'class': 'c1'})) # name参数不写则表示查找所有符合后续条件的标签 print(soup.find(attrs={'class': 'c1'}))
2.find_all方法
优势:查找所有符合条件的标签 该方法的返回结果是一个列表
# name 字段可以省略 查找的结果是一个列表 print(soup.find_all('a')) find_all()使用方法与find一致 但结果数量不一样而已

3.select方法
需要使用css选择器 该方法的返回结果是一个列表
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')) # 查看class含有sister标签内部所有的后代span print(soup.select('.sister span')) # 查找id等于link1的标签 print(soup.select('#link1')) # 查找id等于link1标签内部所有的后代span print(soup.select('#link1 span')) # 查找id等于list-2标签内部所有class为element的标签 # print(soup.select('#list-2 .element')) # 可以一直select,但其实没必要,一条select就可以了 print(soup.select('#list-2')[0].select('.element'))
爬取红牛分公司数据
需求:获取红牛所有分公司详细数据(名称 地址 邮箱 电话)
1.查找数据加载方式 直接加载的
2.朝该网站发送请求获取页面数据筛选即可
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循环和%s来打印出所有的数据
for i in range(len(title_list)): print(""" 公司名称:%s 公司地址:%s 公司邮箱:%s 公司电话:%s """ % (title_list[i], addr_list[i], email_list[i], phone_list[i]))





浙公网安备 33010602011771号