python爬取旅游攻略(1)

news2024/11/6 4:12:38

参考网址

https://blog.csdn.net/m0_61981943/article/details/131262987

  1. 导入相关库,用get请求方式请求网页方式:
import requests
import parsel
import csv
import time
import random
url = f'https://travel.qunar.com/travelbook/list.htm?page=1&order=hot_heat'
response = requests.get(url)

在这里插入图片描述

返回的 HTML 内容

html_data = response.text
print(html_data)

在这里插入图片描述

Selector类允许你创建一个对象,该对象可以用来从给定的 HTML 或 XML 文本中选择特定的元素。

selector = parsel.Selector(html_data)
print(selector)

在这里插入图片描述

selector.css(‘.li h2 a::attr(href)’):

  • selector是前面创建的parsel.Selector对象,它代表网页的 HTML 内容。
  • .css()是parsel.Selector对象的一个方法,用于使用 CSS 选择器语法来选择网页中的元素。
  • '.li h2 a’是 CSS 选择器表达式,它的含义是选择所有具有类名li的元素下的< h2 >标签内的< a >标签。这个选择器的目的是找到网页中特定位置的链接元素。
  • '::attr(href)'是一个 CSS 伪元素选择器,用于选择< a >标签的href属性。它的作用是提取这些链接元素的href属性值,也就是链接地址。
  • .getall():
    这是对前面选择结果的一个操作,用于获取所有满足选择条件的元素的href属性值,并以列表的形式返回。

所以,整行代码的作用是从网页的 HTML 内容中选择具有特定结构的链接元素,并提取它们的链接地址,存储在一个列表url_list中.

url_list = selector.css('.b_strategy_list li h2 a::attr(href)').getall()

在这里插入图片描述

保存到.csv文件里面

csv_qne = open('旅游攻略.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.writer(csv_qne)
csv_writer.writerow(['地点', '标题', '出发时间', '天数', '人均消费', '人物', '玩法', '浏览量''点赞量' ,'作者'])
detail_id = detail_url.replace('/youji/', '')#字符串中移除/youji/部分
url_1 = 'https://travel.qunar.com/travelbook/note/' + detail_id#构建一个完整的 URL,并将其赋值给url_1。这个完整的 URL 很可能是指向旅游攻略详情页面的地址。
for detail_url in url_list:
    # 字符串的 替换方法
    detail_id = detail_url.replace('/youji/', '')#字符串中移除/youji/部分
    url_1 = 'https://travel.qunar.com/travelbook/note/' + detail_id#构建一个完整的 URL,并将其赋值给url_1。这个完整的 URL 很可能是指向旅游攻略详情页面的地址。
    print(url_1)
    response_1 = requests.get(url_1).text
    selector_1 = parsel.Selector(response_1)

    title = selector_1.css('.b_crumb_cont *:nth-child(3)::text').get().replace('旅游攻略', '')
    comment = selector_1.css('.title.white::text').get()
    date = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.when > p > span.data::text').get()
    days = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.howlong > p > span.data::text').get()
    money = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.howmuch > p > span.data::text').get()
    character = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.who > p > span.data::text').get()
    play_list = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.how > p > span.data span::text').getall()
    play = ' '.join(play_list)
    count = selector_1.css('.view_count::text').get()
    print(title, comment, date, days, money, character, play, count)

查找方法

右键检查,查看css字段

在这里插入图片描述

title = selector_1.css('.b_crumb_cont *:nth-child(3)::text').get().replace('旅游攻略', '')

在这里插入图片描述
在这里插入图片描述
右键复制js路径
同理爬取其他数据

一个简单的例子

import requests
import parsel
import csv
import time
import random

url = f'https://travel.qunar.com/travelbook/list.htm?page=1&order=hot_heat'
response = requests.get(url)
#print(response)
html_data = response.text
#print(html_data)
selector = parsel.Selector(html_data)
#print(selector)
url_list = selector.css('.b_strategy_list li h2 a::attr(href)').getall()
#csv_writer.writerow(['地点', '作者','地点', '短评', '出发时间', '天数', '人均消费', '人物', '玩法', '浏览量', '点赞'])
#print(url_list)
for detail_url in url_list:
    detail_id = detail_url.replace('/youji/', '')#字符串中移除/youji/部分
    url_1 = 'https://travel.qunar.com/travelbook/note/' + detail_id#构建一个完整的 URL,并将其赋值给url_1。这个完整的 URL 很可能是指向旅游攻略详情页面的地址。
    print(url_1)
    response_1 = requests.get(url_1).text
    selector_1 = parsel.Selector(response_1)
    comment = selector_1.css('.title.white::text').get()

   # title = selector_1.css('.b_crumb_cont *:nth-child(3)::text').get().replace('旅游攻略', '')
    date= selector_1.css("#js_mainleft > div.b_foreword > ul > li.f_item.when > p > span.data::text").get()
    days=selector_1.css("#js_mainleft > div.b_foreword > ul > li.f_item.howlong > p > span.data::text").get()
    author = selector_1.css("body > div.qn_mainbox > div > div.left_bar > ul > li:nth-child(1) > p.user_info > span.intro > span.user_name > a::text").get()
    dianzan = selector_1.css("body > div.qn_mainbox > div > div.left_bar > ul > li:nth-child(1) > p.user_info > span.nums > span.icon_love > span::text").get()
    print( comment, date, days, author, dianzan)

在这里插入图片描述

如果数据不够:

import requests
import parsel
import csv
import time
import random

# 基础URL
base_url = 'https://travel.qunar.com'
page_number = 1
data_count = 0

# 打开CSV文件,准备写入数据
with open('去哪儿.csv', mode='a', encoding='utf-8', newline='') as csv_qne:
    csv_writer = csv.writer(csv_qne)
    csv_writer.writerow(['地点', '短评', '出发时间', '天数', '人均消费', '人物', '玩法', '浏览量'])
    while data_count < 100:
        url = f'https://travel.qunar.com/travelbook/list.htm?page={page_number}&order=hot_heat'
        # 发送请求获取页面内容
        response = requests.get(url)
        html_data = response.text
        selector = parsel.Selector(html_data)

        # 获取详情页URL列表
        url_list = selector.css('.b_strategy_list li h2 a::attr(href)').getall()

        for detail_url in url_list:
            # 获取详情页ID
            detail_id = detail_url.replace('/youji/', '')
            url_1 = base_url + '/travelbook/note/' + detail_id
            print(url_1)

            # 获取详情页内容
            response_1 = requests.get(url_1).text
            selector_1 = parsel.Selector(response_1)

            # 获取标题,添加错误处理
            title_element = selector_1.css('.b_crumb_cont *:nth-child(3)::text').get()
            if title_element:
                title = title_element.replace('旅游攻略', '')
            else:
                title = None

            # 获取短评,添加错误处理
            comment = selector_1.css('.title.white::text').get()

            # 获取出发时间,添加错误处理
            date = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.when > p > span.data::text').get()

            # 获取天数,添加错误处理
            days = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.howlong > p > span.data::text').get()

            # 获取人均消费,添加错误处理
            money = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.howmuch > p > span.data::text').get()

            # 获取人物,添加错误处理
            character = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.who > p > span.data::text').get()

            # 获取玩法,添加错误处理
            play_list = selector_1.css('#js_mainleft > div.b_foreword > ul > li.f_item.how > p > span.data span::text').getall()
            play = ' '.join(play_list) if play_list else None

            # 获取浏览量,添加错误处理
            count = selector_1.css('.view_count::text').get()

            print(title, comment, date, days, money, character, play, count)

            # 写入数据,如果有值为None则写入空字符串
            if data_count == 0:
                row_data = [title or 'Sample Location', comment or '', date or '', days or '', money or '', character or '', play or '', count or '']
            else:
                row_data = [title or '', comment or '', date or '', days or '', money or '', character or '', play or '', count or '']
            csv_writer.writerow(row_data)
            data_count += 1
            if data_count >= 100:
                break

        # 获取下一页页码信息
        page_links = selector.css("body > div.qn_mainbox > div > div.left_bar > div.b_paging a::attr(href)").getall()
        page_link_numbers = [page_link.split('=')[-1] for page_link in page_links]
        page_numbers = [int(number) for number in page_link_numbers if number.isdigit()]
        if page_numbers:
            max_page = max(page_numbers)
            if page_number < max_page:
                page_number += 1
            else:
                # 如果当前页是最后一页,重新从第一页开始继续获取数据,直到达到100条
                page_number = 1
        else:
            print("未找到页码信息,可能出现问题,继续尝试下一页")
            page_number += 1

        time.sleep(random.randint(1, 3))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++设计模式创建型模式———原型模式

文章目录 一、引言二、原型模式三、总结 一、引言 与工厂模式相同&#xff0c;原型模式&#xff08;Prototype&#xff09;也是创建型模式。原型模式通过一个对象&#xff08;原型对象&#xff09;克隆出多个一模一样的对象。实际上&#xff0c;该模式与其说是一种设计模式&am…

基于STM32的智能温室环境监测与控制系统设计(代码示例)

一、项目概述 在现代农业中&#xff0c;智能大棚能够通过环境监测、数据分析和自动控制等技术手段&#xff0c;实现对作物生长环境的精细化管理。本项目旨在设计一个基于STM32单片机的智能大棚系统&#xff0c;能够实时监测光照强度、空气温湿度及土壤湿度&#xff0c;并根据设…

(五)Web前端开发进阶2——AJAX

目录 1.Ajax概述 2.Axios库 3.认识URL 4.Axios常用请求方法 5.HTTP协议——请求报文/响应报文 6.HMLHttpRequest对象 7.前后端分离开发&#xff08;接口文档&#xff09; 8.Element组件库 1.Ajax概述 AJAX 是异步的 JavaScript和XML(Asynchronous JavaScript And XML)。…

进程信号——信号的保存

信号的概念 实际执行信号的处理动作称为信号递达(Delivery) 信号从产生到递达之间的状态,称为信号未决(Pending)。 进程可以选择阻塞 (Block )某个信号。 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作. 注意,阻塞和忽略是不同的,只要信号…

基于SSM的“房屋租赁系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“房屋租赁系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM&#xff0c;JSP 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 房屋租赁系统首页 管理员后台管理页面 报告故障管…

无需懂代码!用AI工具Bolt一键生成网站的入门指南!

​ ​ 随着AI技术的不断发展&#xff0c;许多原本需要技术门槛的操作正在被大大简化&#xff0c;甚至零基础的用户也可以轻松实现。 例如&#xff0c;AI生成网站工具Bolt就是这样一个可以帮助我们快速创建、实时预览并自动部署网站的平台。接下来&#xff0c;本文将带你深入了…

Elasticsearch中时间字段格式用法详解

Elasticsearch中时间字段格式用法详解 攻城狮Jozz关注IP属地: 北京 2024.03.18 16:27:51字数 758阅读 2,571 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。它提供了全文搜索、结构化搜索以及分析等功能&#xff0c;广泛…

vue中el-table显示文本过长提示

1.el-table设置轻提示:show-overflow-tooltip“true“&#xff0c;改变轻提示宽度

关于我的编程语言——C/C++——第四篇(深入1)

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09; 字符类型介绍 char…

【春秋云镜】CVE-2023-23752

目录 CVE-2023-23752漏洞细节漏洞利用示例修复建议 春秋云镜&#xff1a;解法一&#xff1a;解法二&#xff1a; CVE-2023-23752 是一个影响 Joomla CMS 的未授权路径遍历漏洞。该漏洞出现在 Joomla 4.0.0 至 4.2.7 版本中&#xff0c;允许未经认证的远程攻击者通过特定 API 端…

AI 写作(一):开启创作新纪元(1/10)

一、AI 写作&#xff1a;重塑创作格局 在当今数字化高速发展的时代&#xff0c;AI 写作正以惊人的速度重塑着创作格局。AI 写作在现代社会中占据着举足轻重的地位&#xff0c;发挥着不可替代的作用。 随着信息的爆炸式增长&#xff0c;人们对于内容的需求日益旺盛。AI 写作能够…

快速构建数据产品原型 —— 我用 VChart Figma 插件

快速构建数据产品原型 —— 我用 VChart Figma 插件 10 种图表类型、24 种内置模板类型、丰富的图表样式配置、自动生成图表实现代码。VChart Figma 插件的目标是提供 便捷好用 & 功能丰富 & 开发友好 的 figma 图表创建能力。目前 VChart 插件功能仍在持续更新中&…

源鲁杯 2024 web(部分)

[Round 1] Disal F12查看: f1ag_is_here.php 又F12可以发现图片提到了robots 访问robots.txt 得到flag.php<?php show_source(__FILE__); include("flag_is_so_beautiful.php"); $a$_POST[a]; $keypreg_match(/[a-zA-Z]{6}/,$a); $b$_REQUEST[b];if($a>99999…

【ArcGIS】绘制各省碳排放分布的中国地图

首先&#xff0c;准备好各省、自治区、直辖市及特别行政区&#xff08;包括九段线&#xff09;的shp文件&#xff1a; 通过百度网盘分享的文件&#xff1a;GS&#xff08;2022&#xff09;1873 链接&#xff1a;https://pan.baidu.com/s/1wq8-XM99LXG_P8q-jNgPJA 提取码&#…

C++《list的模拟实现》

在上一篇C《list》专题当中我们了解了STL当中list类当中的各个成员函数该如何使用&#xff0c;接下来在本篇当中我们将试着模拟实现list&#xff0c;在本篇当中我们将通过模拟实现list过程中深入理解list迭代器和之前学习的vector和string迭代器的不同&#xff0c;接下来就开始…

讲讲⾼可用的原则?

大家好&#xff0c;我是锋哥。今天分享关于【讲讲⾼可用的原则&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲讲⾼可用的原则&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在当今信息化时代&#xff0c;随着互联网技术的快速发展&#xff0…

003-Kotlin界面开发之声明式编程范式

概念本源 在界面程序开发中&#xff0c;有两个非常典型的编程范式&#xff1a;命令式编程和声明式编程。命令式编程是指通过编写一系列命令来描述程序的运行逻辑&#xff0c;而声明式编程则是通过编写一系列声明来描述程序的状态。在命令式编程中&#xff0c;程序员需要关心程…

Ubuntu 20.04 部署向量数据库 Milvus + Attu

前言 最开始在自己的办公电脑&#xff08;无显卡的 windows 10 系统&#xff09; 上使用 Docker Desktop 部署了 Milvus 容器&#xff0c;方便的很&#xff0c; 下载 Attu 也很方便&#xff0c;直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来&#xff0c;使用起来感…

Linux(inode + 软硬链接 图片+大白话)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

CM API方式设置YARN队列资源

简述 对于CDH版本我们可以参考Fayson的文章,本次是CDP7.1.7 CM7.4.4 ,下面只演示一个设置队列容量百分比的示例,其他请参考cloudera官网。 获取cookies文件 生成cookies.txt文件 curl -i -k -v -c cookies.txt -u admin:admin http://192.168.242.100:7180/api/v44/clusters …