当前位置: 首页 > article >正文

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).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.kler.cn/a/381875.html

相关文章:

  • 使用Vue的props进行组件传递校验时出现 Extraneous non-props attributes的解决方案
  • Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
  • Python选择题训练工具:高效学习、答题回顾与音频朗读一站式体验
  • Unity3d 基于UGUI和VideoPlayer 实现一个多功能视频播放器功能(含源码)
  • 苏黎世联邦理工学院与加州大学伯克利分校推出MaxInfoRL:平衡内在与外在探索的全新强化学习框架
  • 华院计算参与项目再次被《新闻联播》报道
  • SparkSql读取数据的方式
  • 多模态PaliGemma——Google推出的基于SigLIP和Gemma的视觉语言模型
  • 十四届蓝桥杯STEMA考试Python真题试卷第二套第四题
  • (八)JavaWeb后端开发——Tomcat
  • 使用GitHub Actions实现CI/CD流程
  • JavaScript数据类型- Symbol 详解
  • 各种网络设备的工作原理
  • Hive SQL中判断内容包含情况的全面指南
  • MR30分布式IO模块与高效PLC协同
  • 鸥柏(OBOO)户外触摸广告屏科技创新 高速服务区收费站案例
  • SAP ABAP开发学习——WDA 二 控制器
  • 【笔记】变压器-热损耗-频响曲线推导 - 02 预备知识
  • 如何完全禁用Ant Design Vue 4自带样式
  • 如何使用Web-Check和cpolar实现安全的远程网站监测与管理
  • 华为HarmonyOS借助AR引擎帮助应用实现虚拟与现实交互的能力2-管理AR会话
  • Python+Appium+Pytest+Allure自动化测试框架-安装篇
  • 计算机毕业设计Hadoop+大模型地震预测系统 地震数据分析可视化 地震爬虫 大数据毕业设计 Spark 机器学习 深度学习 Flink 大数据
  • 从源码到成品应用:互联网医院系统与在线问诊APP的开发全解析
  • Java学习路线:Maven(一)认识Maven
  • Unity 中使用 WebGL 构建并运行时使用的图片必须使用web服务器上的