网络爬虫06.21

上周内容回顾

  • 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")

作业

独立完成课上所有的案例并且尝试用不同的查找方式
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值