上周内容回顾
-
bs4四种过滤器
无需刻意记忆 保存好做到有印象之后使用直接查找即可
-
bs4常用方法
find_all name 指定标签名称 attrs 字典指定属性 class_ 直接写class... id 直接写id... find 用法与find_all一致 select css选择器
-
css选择器
标签选择器 'p' 类选择器 '.c1' id选择器 '#d1' 后代选择器 '#d1 .c1' # 查找id是d1标签内部所有class等于c1的标签 儿子选择器 '.c1>span' # 查找class是c1标签内部所有儿子span标签
-
爬取分公司数据
1.直接朝url发送get请求 验证能否直接获取到数据 如果不能则需要考虑防爬措施 2.研究标签规律筛选出目标数据 你通过右键点击查看和点击查看网页源码 两者数据是不一致 点击查看展示出来的是浏览器帮你优化之后的结果 而点击查看网页源码才是真正的数据结果 3.选择合适的筛选方法获取数据 正则表达式 贪婪匹配(.*)与非贪婪匹配(.*?) bs模块 find_all find select 4.保存数据 写入文件 写入excel表格(pandas模块) 写入数据库(爬虫获取到的数据一般都是保存在mongodb中) ...
-
爬取二手房数据
1.研究url规律 省 区位置区分 2.朝确定的url发送get请求获取数据 验证能否直接获取到数据 如果不能则需要考虑防爬措施 3.研究页面规律制定筛选策略 1.整体查找策略 课上已经完成书写 2.局部查找策略
今日内容概要
-
爬取二手房数据局部查找策略
-
多页爬取思路(找规律很简单)
-
爬取天气数据(爬虫进阶思想)
有时候页面数据并不是直接就可以获取到 有时候的网页数据是通过js代码动态渲染的
-
爬取汽车之家新闻数据
-
爬取贴吧图片数据
今日内容详细
爬取二手房数据局部查找策略
import requests
from bs4 import BeautifulSoup
res = requests.get('https://sh.lianjia.com/ershoufang/pudong/')
soup = BeautifulSoup(res.text,'lxml')
# title_list = soup.find_all('div',class_='title')
# 在筛选的基础之上添加更加详细的筛选策略
title_div_list = soup.select('.info>.title')
# for循环查找即可
# title_list = []
# for div in title_div_list:
# a = div.a
# title_list.append(a.text)
title_list = [div.a.text for div in title_div_list] # 列表生成式
addr_div_list = soup.select('.info>.flood')
addr_list = [div.text.split('-') for div in addr_div_list]
info_div_list = soup.select('.info>.address')
info_list = [div.text.split('|') for div in info_div_list]
comment_div_list = soup.select('.info>.followInfo')
comment_list = [div.text for div in comment_div_list]
total_div_list = soup.select('.info>.priceInfo>.totalPrice')
total_list = [div.text for div in total_div_list]
unit_div_list = soup.select('.info>.priceInfo>.unitPrice')
unit_list = [div.text for div in unit_div_list]
多页爬取思路
'''多页一般都是研究url的变化规律即可'''
https://sh.lianjia.com/ershoufang/pudong/
https://sh.lianjia.com/ershoufang/pudong/pg2/
https://sh.lianjia.com/ershoufang/pudong/pg3/
# 推测第一页 https://sh.lianjia.com/ershoufang/pudong/pg1/
import requests
from bs4 import BeautifulSoup
title_list = []
addr_list = []
info_list = []
comment_list = []
total_list = []
unit_list = []
# 函数封装思路
def get_info(base_url):
res = requests.get(base_url)
soup = BeautifulSoup(res.text, 'lxml')
# title_list = soup.find_all('div',class_='title')
# 在筛选的基础之上添加更加详细的筛选策略
title_div_list = soup.select('.info>.title')
# for循环查找即可
# title_list = []
for div in title_div_list:
a = div.a
title_list.append(a.text)
# title_list = [div.a.text for div in title_div_list]
addr_div_list = soup.select('.info>.flood')
for div in addr_div_list:
addr_list.append(div.text)
# addr_list = [div.text.split('-') for div in addr_div_list]
info_div_list = soup.select('.info>.address')
for div in info_div_list:
info_list.append(div.text)
# info_list = [div.text.split('|') for div in info_div_list]
comment_div_list = soup.select('.info>.followInfo')
for div in comment_div_list:
comment_list.append(div.text)
# comment_list = [div.text for div in comment_div_list]
total_div_list = soup.select('.info>.priceInfo>.totalPrice')
for div in total_div_list:
total_list.append(div.text)
# total_list = [div.text for div in total_div_list]
unit_div_list = soup.select('.info>.priceInfo>.unitPrice')
for div in unit_div_list:
unit_list.append(div.text)
# unit_list = [div.text for div in unit_div_list]
return True
def save_info():
import pandas as pd
house_dict = {
'房屋名称': title_list,
'房屋地址': addr_list,
'房屋详细': info_list,
'房屋热度': comment_list,
'房屋总价': total_list,
'房屋单价': unit_list
}
df = pd.DataFrame(house_dict)
df.to_excel(r'house.xlsx')
def start_work():
for i in range(1,2):
base_url = 'https://sh.lianjia.com/ershoufang/pudong/pg%s/'%i
res = get_info(base_url)
if res:
save_info()
else:
print("发送了位置的错误")
# 整体启动程序
start_work()
爬取天气数据(爬虫进阶思想)
import requests
from bs4 import BeautifulSoup
# res = requests.get('https://tianqi.2345.com/wea_history/60010.htm')
# res.encoding = 'utf8'
# 只获取当前月份的天气数据(非常简单) 只需要筛选table标签内的数据即可
# import pandas as pd
# res1 = pd.read_html('https://tianqi.2345.com/wea_history/60010.htm')
# res1[0].to_excel(r'tianqi.xlsx')
# 获取历史月份数据
"""
######################################################################
历史月份数据并不在当前url请求的网页内
但是点击按钮之后url不变数据却发送了变化 数据从何而来?
数据是通过内部js代码发送请求动态加载的
如何应对上述js代码动态加载的问题?
通过浏览器network查找js代码请求的网址(这个网址就是数据来源)
上述是固定的套路
######################################################################
"""
# 点击network查看网络请求
# 点击上一月检测内部请求
# 查找请求的url 先用浏览器尝试着直接访问 获取获取数据来源的url
res = requests.get('https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=5')
# json格式字符串
# print(res.text,type(res.text)) # <class 'str'>
# 将json格式字符串转换成python中的字典 反序列化
# import json
# data = json.loads(res.text)
# print(data,type(data)) # <class 'dict'>
# requests返回值对象本身也含有反序列化功能
data = res.json()
# print(data,type(data)) # <class 'dict'>
real_info = data.get('data')
import pandas as pd
history_info = pd.read_html(real_info)
# print(history_info)
history_info[0].to_excel(r'historyInfo.xlsx')
url找规律
https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=5
https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=4
https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=60010&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=3
https://tianqi.2345.com/Pc/GetHistory?areaInfo%5BareaId%5D=71449&areaInfo%5BareaType%5D=2&date%5Byear%5D=2021&date%5Bmonth%5D=
# 拔高练习 自定义爬取用户指定月份或者地区的数据(课外练习)
爬取汽车之家新闻数据
import requests
from bs4 import BeautifulSoup
# 1.直接先朝url发送请求
res = requests.get('https://www.autohome.com.cn/news/')
res.encoding = 'gbk' # 汽车之家默认的编码是gbk
# print(res.text)
# 2.研究标签规律筛选数据(两种思路)
soup = BeautifulSoup(res.text,'lxml')
# 查看所有新闻所在的li标签
li_html_list = soup.select('.article>li')
# for循环一个个li标签
"""
有时候我们研究出了HTML的规律之后 通过代码批量获取数据也会有报错的可能
原因是页面的设计者会故意在页面上加一些干扰项
"""
a_list = []
img_list = []
time_list = []
read_list = []
desc_list = []
for li in li_html_list:
a = li.a # 这里我们是明确看出了是第一个a
if a:
a_list.append('https:' + a.get('href'))
img = li.img # 这里我们是明确看出了是第一个img
if img:
# if img.get('src').startswith('https:'):
# img_list.append(img.get('src'))
# else:
# img_list.append('https:' + img.get('src'))
# 三元表达式
img_list.append(img.get('src') if img.get('src').startswith('https:') else 'https:' + img.get('src'))
span = li.span # # 这里我们是明确看出了是第一个span
if span:
time_list.append(span.text)
em = li.select('.fn-right em')
if em:
read_list.append(em[0].text)
p = li.p
if p:
desc_list.append(p.text)
import pandas as pd
info_dict = {
'新闻链接':a_list,
'新闻图片':img_list,
'发布时间':time_list,
'阅读数量':read_list,
'新闻简介':desc_list
}
df = pd.DataFrame(info_dict)
df.to_excel(r'news.xlsx')
"""
作业:
1.尝试着爬取多页数据
2.尝试着将代码优化封装
思考:如果还想获取文字详情内容怎么办?
写出你的思路
"""
selenium
能够通过代码自动操作当前计算机上面的浏览器
下载模块
pip3 install selenium
下载驱动(一定要做)
http://npm.taobao.org/mirrors/chromedriver/2.38/
解压之后的exe文件放入到python解释器的scripts文件夹内即可
# 基本使用
from selenium import webdriver
bro=webdriver.Chrome() # 操作谷歌浏览器打开百度
bro.get("http://www.baidu.com")
作业
独立完成课上所有的案例并且尝试用不同的查找方式