Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 爬取飞猪上全国景点的数据

Python 爬取飞猪上全国景点的数据

作者头像
伪君子
发布于 2019-09-12 04:43:54
发布于 2019-09-12 04:43:54
1K00
代码可运行
举报
文章被收录于专栏:伪君子的梦呓伪君子的梦呓
运行总次数:0
代码可运行

0 前言

前段时间有人找我写代码爬点东西,就是爬飞猪上全国景点的当月销量、优惠价、城市这些数据,等我写好了之后,他说不要了…

没辙,只能完善一下之后写出来了。

1 环境说明

Win10 系统下 Python3,编译器是 Pycharm。

需要安装 requests,bs4,selenium 这个第三方库,直接 pip install 就可以了。还需要配置一下 driver,我用的是谷歌浏览器,所以直接用 chromedriver,配置的方法具体看这里

2 代码

万恶之首先导包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import csv
import time
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

先建一个 csv 文件来保存数据,我不想存储到数据库,只能这样了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 新建一个 fliggy.csv 文件,w 表示是新创建一个文件, encoding 为 utf-8-sig,中文能正常显示,
# newline="" 不能省略,省略了之后,会换行
with open("fliggy.csv", "w", encoding='utf-8-sig', newline="") as f:
    csv_write = csv.writer(f)
    csv_head = ["景点", "城市", "当月销量", "优惠价", "价格"]
    csv_write.writerow(csv_head)
newline="" 不能省略,一省略就会导致换行多换了一行,如下图所示

接着就是配置 chromedriver

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
options = Options()
# options.add_argument('--headless')  # headless, 无头浏览器, 不显示用户界面
options.add_argument('--disable-gpu')  # 不使用 gpu
# options.add_argument("--incognito")  # 以隐身模式打开
prefs = {"profile.managed_default_content_settings.images": 2}  # 不显示图片
options.add_experimental_option("prefs", prefs)
# chromedriver.exe 的路径
driver_path = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
driver = webdriver.Chrome(executable_path=driver_path, options=options)

配置好之后就是开始爬,这里先用广州进行测试,所以 url 是广州的

driver.get(url) 的意思是 chromedriver 去访问这个 url。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url = 'http://s.fliggy.com/scenic/list.htm?q=广州'
driver.get(url)
print(url)
try:
    # 获取页数
    next_num = driver.find_element_by_xpath("//a[@class='pi-pagination-num'][3]").text
    print(next_num)
except Exception as e:
    # 处理只有一页的情况
    next_num = 1
    print(e)

next_num 是 一共有多少页,这个是用 xpath 来定位的,//a[@class='pi-pagination-num'][3], class 名为 pi-pagination-num 的 第 3 个 a 标签就是页数所在的地方。

next_num=driver.find_element_by_xpath("//a[@class='pi-pagination-num'][3]").text 就是把页数对应的文字获取到。

还记得 next_num 吗,它是总页数,所以我们需要一个 for 循环,一页一页去获取数据。

range(0, int(next_num)),从 0 开始到 总页数。Python 中,range(0, 10)的意思是从0 到 9 开始计数,计到 10 结束,但不包括 10。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for i in range(0, int(next_num)):
    links = driver.find_elements_by_xpath("//a[@class='pi-btn pi-btn-primary']")

    for link in links:
        try:
            print(link.get_attribute("href"))
            res = requests.get(link.get_attribute("href"), timeout=10)
            # print(res.text)
            soup = BeautifulSoup(res.text, 'lxml')
            name = soup.find('h3', {'class': 'scenic-tit'}).get_text().strip()
            city = soup.find('span', {'class': 'scenic-subtit'}).get_text().strip()
            sell_count = soup.find('dl', {'class': 'sell-count'}).find('dd').find('em').get_text().strip()
            scenic_price = soup.find('span', {'class': 'pi-price-lgt'}).get_text().strip()
            price = soup.find('div', {'class': 'right-area'}).find('span', {'class': 'pi-price'}).get_text().strip()

            row = [name, city, sell_count, scenic_price, price]
            # encoding 为 utf-8-sig, 中文能正常显示, 不信的话, 换成 utf-8试试
            out = open("fliggy.csv", "a+", encoding='utf-8-sig', newline="")
            csv_writer = csv.writer(out, dialect="excel")
            csv_writer.writerow(row)
            out.close()
        except Exception as e:
            print(e)
    try:
        # 点击下一页
        driver.find_element_by_class_name('pi-pagination-next').click()
    except Exception as e:
        print(e)
    # 休息 3 秒接着干
    time.sleep(3)

# 搞定收工,退出浏览器
driver.quit()

links=driver.find_elements_by_xpath("//a[@class='pi-btn pi-btn-primary']") 是找到网页上所有的 class 属性为 pi-btn pi-btn-primary 的 a 标签。

driver.find_element_by_xpath是找一个,driver.find_elements_by_xpath找所有的,区别就在于 element 后面加没加一个 s。

得到的 links 是一个列表,需要一个一个获取需要的 href 属性,因为这个属性里面的就是景点的链接。

res=requests.get(link.get_attribute("href"), timeout=10)的意思就是用 requests 去请求获取到的链接。

soup=BeautifulSoup(res.text, 'lxml') ,res.text 就是获取到的网页源码。用 BeautifulSoup 使用 lxml 解析器解析一下网页源码。(可以把 soup 打印出来看一下)

name 是景点名,city 是景点所在的城市,sell_count 是当月销量,scenic_price 是优惠价,price 是价格。

这里以 sell_count 来讲解一下代码,sell_count=soup.find('dl', {'class': 'sell-count'}).find('dd').find('em').get_text().strip(), 在解析过的网页源码中,也就是 soup 中找到 class 属性为 sell-count 的 dl 标签,然后在 dl 标签里面找到 dd 标签,接着找到 em 标签。

.get_text() 是获取到里面的文字,.strip() 是去掉空格(以防万一)

别的字段都类似 sell_count 这样获取。

把数据获取到之后肯定就是保存下来,row 里面就是需要保存的数据。

以追加的形式打开 fliggy.csv,写入数据,然后 out.close() 关闭 fliggy.csv。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
row = [name, city, sell_count, scenic_price, price]
# encoding 为 utf-8-sig, 中文能正常显示, 不信的话, 换成 utf-8试试
out = open("fliggy.csv", "a+", encoding='utf-8-sig', newline="")
csv_writer = csv.writer(out, dialect="excel")
csv_writer.writerow(row)
out.close()

driver.find_element_by_class_name('pi-pagination-next').click(), 这个就是点击下一页,前面那一堆是定位到下一页,.click() 就是点击。

最终爬下来的就是下面这样,

3 相关说明

链接是 http://s.fliggy.com/scenic/list.htm?q=广州 就是爬飞猪上广州的景点;把广州改成广东就是爬广东的;改成中国,那就是爬飞猪上全国的景点。

文章还是得多写,好久没写了,居然没感觉了。

本来是懒得写的,但是学 SEO,老师布置了个作业,要露出个外链(lbjheiheihei.xyz),只能不要脸的来写篇文章了,点击阅读原文就能跳转到了~

相关文章:

Python 用 ChromeDriver 实现登录和签到 用 Python 爬取豆瓣电影海报

题图:Photo by Pierre Gillier on Unsplash

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 伪君子的梦呓 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何采集世俱杯冠军数据
假设 zh-pm.com 存在世俱杯历史数据页面(如 http://zh-pm.com/fifa-club-world-cup-winners),页面结构通常包含:
六十三
2025/07/10
1400
不会写代码 用DeepSeek实现爬虫
利用Python爬取我的博客中的所有文章标题和标题链接。(需要翻页,每一页的规律如下:如第二页为https://blog.bbskali.cn/page/2/第三页为 https://blog.bbskali.cn/page/3/ 第四页为 https://blog.bbskali.cn/page/4/ 以此类推。)博客地址:https://blog.bbskali.cn 将结果保存为csv格式并输出。文章标题html代码如下:
逍遥子大表哥
2025/07/28
1721
不会写代码 用DeepSeek实现爬虫
【Python爬虫五十个小案例】爬取豆瓣电影Top250
文章链接:https://cloud.tencent.com/developer/article/2470420
小馒头学Python
2024/11/25
1.2K0
【Python爬虫五十个小案例】爬取豆瓣电影Top250
爬取百度百科5A景点摘要并实现分词
这里baike_spider.py用来爬取景点摘要,内容放在senic_spots目录中; cut_word.py用来分词,分词结果放在cut_word_result中; scenic_spots_5A.txt中列出了所要爬取的景点的名称,具体内容如下:
海天一树
2018/07/25
5140
爬取百度百科5A景点摘要并实现分词
【Python爬虫五十个小案例】爬取中国天气网城市天气
文章链接:https://cloud.tencent.com/developer/article/2472928
小馒头学Python
2024/12/02
2.7K0
【Python爬虫五十个小案例】爬取中国天气网城市天气
【Python爬虫五十个小案例】爬取全国高校名单
文章链接:https://cloud.tencent.com/developer/article/2472469
小馒头学Python
2024/12/01
5070
【Python爬虫五十个小案例】爬取全国高校名单
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
猫头虎
2025/06/02
4.1K0
用 Python 写你的第一个爬虫:小白也能轻松搞定数据抓取(超详细包含最新所有Python爬虫库的教程)
小红书采集获客工具,小红书采集提取软件,评论作品ID链接python版
成品下载地址:https://www.pan38.com/yun/share.php?code=JCnzE 提取密码:1133
用户11744395
2025/07/13
3850
携程,去哪儿评论,攻略爬取
前几天受朋友委托要爬取携程网和去哪儿网一些景点的评论,在翻阅了许多代码后并自己改写后终于完成。
doper
2022/09/26
1.9K0
携程,去哪儿评论,攻略爬取
Airbnb爬取某地区房源的所有评论
本文代码由python requests+json爬取ajax加载 爱彼迎深圳所有房源借鉴修改而成。
xuing
2019/10/19
1.8K0
Python爬取某宝商品数据案例:100页的价格、购买人数等数据
随着互联网时代的到来,人们更加倾向于互联网购物,某宝又是电商行业的巨头,在某宝平台中有很多商家数据,今天带大家使用python+selenium工具获取这些公开的。
松鼠爱吃饼干
2020/09/15
1.8K0
Python爬取某宝商品数据案例:100页的价格、购买人数等数据
python爬取北京公交数据
弟大不用洗
2024/10/17
2730
Python爬取东方财富网资金流向数据并存入MySQL
首先我们需要安装selenium库,使用命令pip install selenium;然后我们需要下载对应的chromedriver,,安装教程:。我们的chromedriver.exe应该是在C:\Program Files\Google\Chrome\Application中(即让它跟chrome.exe在同一个文件下)。
润森
2022/08/18
2.9K0
Python爬取东方财富网资金流向数据并存入MySQL
Python爬取去哪了旅游景点数据
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理
松鼠爱吃饼干
2020/11/04
1.3K0
Python爬取去哪了旅游景点数据
Python + Selenium 自动化爬取途牛动态网页
在互联网数据采集领域,动态网页(即通过JavaScript异步加载数据的网页)的爬取一直是一个挑战。传统的**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">requests</font>**+**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">BeautifulSoup</font>**组合适用于静态页面,但对于动态渲染的内容(如途牛旅游网的酒店、景点、评论等)则难以直接获取。
小白学大数据
2025/07/18
1160
Python + Selenium 自动化爬取途牛动态网页
Python爬虫 爬取北京二手房数据
Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取!
python学习教程
2019/07/10
1.1K0
Python爬虫 爬取北京二手房数据
python自动化爬虫实战
由于需要实现模拟手动点击浏览器的效果,因此笔者使用到了chromedriver.exe自动化驱动文件。这里选择谷歌浏览器相同版本的驱动。 驱动下载中心
猫老师的叶同学
2023/05/11
4120
python自动化爬虫实战
Python+Selenium自动化爬取携程动态加载游记
在旅游行业数据分析、舆情监测或竞品研究中,获取携程等平台的游记数据具有重要价值。然而,携程的游记页面通常采用动态加载(Ajax、JavaScript渲染),传统的**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">Requests</font>**+**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">BeautifulSoup</font>**方案难以直接获取完整数据。
小白学大数据
2025/07/17
1240
从登陆到爬取:Python反反爬获取某宝成千上万条公开商业数据
chrom浏览器的驱动器下载地址:http://npm.taobao.org/mirrors/chromedriver/
荣仔_最靓的仔
2021/02/02
1.3K0
从登陆到爬取:Python反反爬获取某宝成千上万条公开商业数据
Python3--baby网的数据爬取
上代码: ''' 本代码用来爬取https://www.babyment.com/yingwenming/kaitou.php?start_letter=A&page=1的信息 ''' import
K同学啊
2019/01/22
4650
推荐阅读
相关推荐
如何采集世俱杯冠军数据
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验