Python爬取马蜂窝城市游记

游记标题、用户、日期、阅读数量、评论数量

上一篇: Python爬取马蜂窝各城市游记总数.爬取了马蜂窝所有城市的游记总数,本文爬取具体城市的游记详情

import os
import time
import random

import pymysql
import requests
from lxml import etree
import pandas as pd
from sqlalchemy import create_engine


def page(url):
    # ua伪装
    headers = {'user-agent': '浏览器的user-agent'}

    response = requests.get(url=url, headers=headers)
    page_text = response.text
    return page_text


def notes_detail(city_id):

    note_id = 1
    # 新建空dataframe用来存放爬到的数据
    note_detail_dataframe = pd.DataFrame([], columns=['id', 'title', 'user_name', 'date', 'read_number', 'decision'])

    url = 'http://www.mafengwo.cn/yj/%s/'
    url_1 = format(url % city_id)
    url_2 = url_1 + 's-0-0-%s'
    for i in range(1, 5):
        url_3 = format(url_2 % str(i))
        # 第一页
        url_4 = url_3 + '-0-1-0.html'
        page_text = page(url_4)
        tree = etree.HTML(page_text)
        # 页数
        page_number = int(tree.xpath('//div[@class="_pagebar"]/div/span[1]/span[1]/text()')[0])
        for num in range(1, page_number + 1):
            url_5 = url_3 + '-0-%s-0.html'
            url_6 = format(url_5 % str(num))
            page_ = page(url_6)
            tree_ = etree.HTML(page_)
            li_list = tree_.xpath('//div[@class="_notelist"]/div/ul/li')
            for li in li_list:
                try:
                    title = li.xpath('.//a[@class="title-link"]/text()')[0]
                    user_name = li.xpath('./div[3]/span/a[2]/text()')[0]
                    date_ = li.xpath('./div[3]/span[2]/span/text()')[0]
                    date = "20" + date_
                    read_number = li.xpath('./span/text()[1]')[0]
                    decision = li.xpath('./span/text()[2]')[0]
                except Exception as e:
                    print(e)
                    break

                note_detail_dataframe.loc[note_id - 1, 'id'] = note_id
                note_detail_dataframe.loc[note_id - 1, 'title'] = title
                note_detail_dataframe.loc[note_id - 1, 'user_name'] = user_name
                note_detail_dataframe.loc[note_id - 1, 'date'] = date
                note_detail_dataframe.loc[note_id - 1, 'read_number'] = read_number
                note_detail_dataframe.loc[note_id - 1, 'decision'] = decision
                note_id += 1
                print(note_id, title, user_name, date, read_number, decision)

            # 随机生成0.2-1秒的一位小数
            random_sleep_time = float(round(random.uniform(0.2, 1.0), 1))
            # 休眠随机数秒
            time.sleep(random_sleep_time)
            # 只爬前三页
            if num == 3:
                break
        # 随机生成0.2-1秒的一位小数
        random_sleep_time = float(round(random.uniform(0.2, 1.0), 1))
        # 休眠随机数秒
        time.sleep(random_sleep_time)

    if city_id == '10065':
        check_csv("beijing")
        note_detail_dataframe.set_index('id', inplace=True)
        note_detail_dataframe.to_csv('./CSV/beijing.csv')
    elif city_id == '10099':
        check_csv("shanghai")
        note_detail_dataframe.set_index('id', inplace=True)
        note_detail_dataframe.to_csv('./CSV/shanghai.csv')
    elif city_id == '10208':
        check_csv("chongqing")
        note_detail_dataframe.set_index('id', inplace=True)
        note_detail_dataframe.to_csv('./CSV/chongqing.csv')
    else:
        check_csv("tianjin")
        note_detail_dataframe.set_index('id', inplace=True)
        note_detail_dataframe.to_csv('./CSV/tianjin.csv')

# 检查csv文件是否存在
def check_csv(csv_name):
    path = './CSV'
    file = path + '/' + csv_name + '.csv'
    if not os.path.exists(path):
        os.makedirs(path)
    if not os.path.exists(file):
        # os.mknod(file)
        f = open(file, 'w')
        f.close()

def beijing_detail():
    city_id_list = ['10065', '10099', '10208', '10320']
    city_id = city_id_list[0]
    notes_detail(city_id)


def shanghai_detail():
    city_id = '10099'
    notes_detail(city_id)


def chongqing_detail():
    city_id = '10208'
    notes_detail(city_id)


def tianjin_detail():
    city_id = '10320'
    notes_detail(city_id)


if __name__ == '__main__':
    beijing_detail()
    shanghai_detail()
    chongqing_detail()
    tianjin_detail()

本文的爬虫,只爬取每个城市的5个类别的前3页,将# 只爬前三页 if num == 3: break删除即可爬取全部内容

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Python爬虫是一种用于自动化获取网络上数据的技术,可以用来爬取各类网站的内容。马蜂窝是一个旅游网站,用户可以在其中发布旅游攻略、游记、评论等信息。如果想要爬取马蜂窝上的评论,可以通过Python爬虫来实现。 首先,需要分析马蜂窝的结构,找到包含评论信息的标签和类名等相关信息。可以利用浏览器开发者工具来查看网源代码,寻找评论所在的HTML元素。 然后,使用Python爬虫库,例如BeautifulSoup、Requests等,来发送HTTP请求获取网内容,并解析网。首先发送一个请求获取网源代码,然后使用BeautifulSoup等库解析HTML,找到评论所在的标签和属性,进而提取出评论内容。 接下来,可以编写循环来遍历多个面,因为马蜂窝的评论可能会分展示。可以通过修改URL的参数来获取下一的评论内容,并将获取到的评论数据添加到一个列表或文件中保存。 为了防止被网站封IP或其他反爬措施,可以模拟浏览器行为,例如添加User-Agent、增加访问时间间隔等来降低爬虫被发现的概率。 最后,可以根据需求对爬取的评论数据进行处理和分析,例如统计热门景点的评价情况、评论者的情感分析等。 需要注意的是,爬取网站数据要遵守法律法规和网站的使用规定,不得进行非法的行为,例如恶意攻击网站、侵犯用户隐私等。同时,为避免给网站造成过多的访问压力,可以控制爬取频率,适度使用缓存技术,尊重网站的服务器资源。 综上所述,通过Python爬虫可以很方便地实现马蜂窝评论的爬取,通过分析网结构、发送HTTP请求、解析HTML等步骤,可以获取到评论数据并进行后续处理和分析。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值