python爬取旅游攻略(1)

参考网址

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).textselector_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 randomurl = 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).textselector_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.textselector = parsel.Selector(html_data)# 获取详情页URL列表url_list = selector.css('.b_strategy_list li h2 a::attr(href)').getall()for detail_url in url_list:# 获取详情页IDdetail_id = detail_url.replace('/youji/', '')url_1 = base_url + '/travelbook/note/' + detail_idprint(url_1)# 获取详情页内容response_1 = requests.get(url_1).textselector_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 += 1if 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 += 1else:# 如果当前页是最后一页,重新从第一页开始继续获取数据,直到达到100条page_number = 1else:print("未找到页码信息,可能出现问题,继续尝试下一页")page_number += 1time.sleep(random.randint(1, 3))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于单片机的农业自动灌溉系统

本设计基于单片机的农业自动灌溉系统&#xff0c;以STM32F103C8T6单片机为控制核心&#xff0c;采用电容式土壤传感器来测量土壤湿度&#xff0c;DHT11温湿度检测模块来测量环境温湿度&#xff0c;OLED屏幕来显示实时时间、Wi-Fi连接状态、环境温湿度、土壤湿度情况以及灌溉情况…

安全工程师入侵加密货币交易所获罪

一名高级安全工程师被判犯有对去中心化加密货币交易所的多次攻击罪&#xff0c;在此过程中窃取了超过 1200 万美元的加密货币。 沙克布艾哈迈德&#xff08;Shakeeb Ahmed&#xff09;被判刑&#xff0c;美国检察官达米安威廉姆斯&#xff08;Damian Williams&#xff09;称其…

Istio Gateway发布服务

1. Istio Gateway发布服务 在集群中部署一个 tomcat 应用程序。然后将部署一个 Gateway 资源和一个与 Gateway 绑定的 VirtualService&#xff0c;以便在外部 IP 地址上公开该应用程序。 1.1 部署 Gateway 资源 vim ingressgateway.yaml --- apiVersion: networking.istio.…

Linux云计算 |【第五阶段】CLOUD-DAY9

主要内容&#xff1a; Metrics资源利用率监控、存储卷管理&#xff08;临时卷ConfitMap、EmptyDir、持久卷HostPath、NFS(PV/PVC)&#xff09; 一、Metrics介绍 metrics是一个监控系统资源使用的插件&#xff0c;可以监控Node节点上的CPU、内存的使用率&#xff0c;或Pod对资…

Java 异常处理的最佳实践

在 Java 开发中&#xff0c;异常处理是一个非常重要的环节。良好的异常处理实践可以提高代码的健壮性、可读性和可维护性。本文将介绍 20 个异常处理的最佳实践&#xff0c;帮助你在实际开发中避免常见的陷阱。 1. 尽量不要捕获 RuntimeException 阿里出品的 Java 开发手册上…

系统上云-流量分析和链路分析

优质博文&#xff1a;IT-BLOG-CN 一、流量分析 【1】流量组成&#xff1a; 按协议划分&#xff0c;流量链路可分为HTTP、SOTP、QUIC三类。 HTTPSOTPQUIC场景所有HTTP请求&#xff0c;无固定场景国内外APP等海外APP端链路选择DNS/CDN(当前特指Akamai)APP端保底IP列表/动态IP下…

Linux网络编程之UDP编程

UDP编程效率高&#xff0c;不需要差错校验&#xff0c;在视频点播场景应用高 基于UDP协议客户端和服务端的编程模型&#xff0c;和TCP模型有点类似&#xff0c;有些发送接收函数不同,TCP是之间调用I/O函数read0或write()进行读写操作&#xff0c;而UDP是用sendto()和readfrom(…

【C++动态规划 01背包】2787. 将一个数字表示成幂的和的方案数|1817

本文涉及知识点 C动态规划 C背包问题 LeetCode2787. 将一个数字表示成幂的和的方案数 给你两个 正 整数 n 和 x 。 请你返回将 n 表示成一些 互不相同 正整数的 x 次幂之和的方案数。换句话说&#xff0c;你需要返回互不相同整数 [n1, n2, …, nk] 的集合数目&#xff0c;满…

服务器开放了mongodb数据库的外网端口,但是用mongodbCompass还是无法连接。

数据库的配置文件中有个bingIp也就是绑定固定的ip才能访问数据库&#xff0c;默认是127.0.0.1也就是只能本地访问&#xff0c;所以无法连接。设置为0.0.0.0则表示所有地址都能访问。 最后再确定一下防火墙的端口是否正常开放

《Linux运维总结:基于银河麒麟V10+ARM64架构CPU部署redis 6.2.14 TLS/SSL哨兵集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、简介 Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障转移,从而确保服务的连续性。哨兵模式的核心组件包括哨兵(Sentine…

JDK1.5 java代码打包jar HmacSha256

文章目录 demo地址背景实现编写代码编译class文件打包 JAR 文件执行生成的 JAR 文件辅助验证方式 常见问题和解决方法常规生成jar方案maven插件idea工具 demo地址 https://github.com/xiangge-zx/HmacSha256 背景 最近接到一个需求,做一个可以用来HmacSha256加密的小工具&am…

数据结构与算法分析:专题内容——动态规划1之理论讲解(代码详解+万字长文+算法导论+力扣题)

一、前言 The future is independent of the past given the present 未来独立于过去&#xff0c;只基于当下。 马尔可夫链&#xff0c;即状态空间中经过从一个状态到另一个状态的转换的随机过程。 0 在开始之前请认真理解下面这段话&#xff1a; 决策类求最优解问题&#xf…

25.停车场管理系统(基于web的Java项目)

目录 1.系统的受众说明 2.相关技术与方法 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 需求分析 3.2.1 系统功能描述 3.2.2 用例图分析 4. 系统设计 4.1 系统类分析 5. 系统详细设计与实现 5.1 用户登录 5.2 系统信…

【网络】自定义协议——序列化和反序列化

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是序列化和分序列&#xff0c;并且自己能手撕网络版的计算器。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…

.NET 8 中 Entity Framework Core 的使用

本文代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/89935738 概述 Entity Framework Core (EF Core) 已成为 .NET 开发中数据访问的基石工具&#xff0c;为开发人员提供了强大而多功能的解决方案。随着 .NET 8 和 C# 10 中引入的改进&#xff0c;开发人…

Docker学习—Docker的安装与使用

Docker安装 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 首先…

ArcGIS006:ArcMap常用操作151-200例动图演示

摘要&#xff1a;本文介绍了ArcMap邻域分析、栅格表面分析、水文分析、区域分析、提取分析等工具箱中的工具功能。包括计算图层间点、线、面要素间的距离、位置和角度&#xff0c;创建缓冲区&#xff0c;添加计算信息到属性表&#xff0c;分割面要素&#xff0c;编号&#xff0…

小菜家教平台(三):基于SpringBoot+Vue打造一站式学习管理系统

目录 前言 今日进度 详细过程 相关知识点 前言 昨天重构了数据库并实现了登录功能&#xff0c;今天继续进行开发&#xff0c;创作不易&#xff0c;请多多支持~ 今日进度 添加过滤器、实现登出功能、实现用户授权功能校验 详细过程 一、添加过滤器 自定义过滤器作用&…

SQL进阶技巧:如何计算复合增长率?

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 复合增长率是第N期的数据除以第一期的基准数据&#xff0c;然后开N-1次方再减去1得到的结果。假如2018年的产品销售额为10000&#xff0c;2019年的产品销售额为12500&#xff0c;2020年的产品销售额为15000&…

python-docx -- 读取word图片

文章目录 概念介绍形状对象读取图片自定义图形 概念介绍 从概念上来讲&#xff0c;word文档分为两层&#xff0c;一个文本层&#xff0c;一个绘画层&#xff1b; 文本层&#xff0c;从上到下&#xff0c;从左到右&#xff0c;流式排版&#xff0c;本页填满则开启新页面&#…