首页 > 其他分享 >一个携程的酒店爬虫代码

一个携程的酒店爬虫代码

时间:2024-12-08 20:10:31浏览次数:2  
标签:__ 酒店 携程 self list 爬虫 str import def

import random
import time
from datetime import datetime

from pymongo import MongoClient
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.edge.options import Options
import selenium
import pyquery
from ConnectionPool import Client_Pool
from abc import ABC, abstractmethod
from cookies.CookieSaver import CookieSaver


class BaseCrawler(ABC):
    @abstractmethod
    def crawl(self, url: str):
        pass

    @abstractmethod
    def parse(self):
        pass

    @abstractmethod
    def save(self):
        pass



class CrawlerData:
    dataList: list[dict[str, any]]
    dataDict: dict[str, any]
    cssDict: dict[str, str]

    def __init__(self, css_dict: dict[str, str]):
        self.cssDict = css_dict
        self.dataList = []
        self.dataDict = {}

    def write(self, col_name: str, value: any):
        self.dataDict[col_name] = value

    def css(self, name: str) -> str:
        return self.cssDict.get(name, "")

    def nextRow(self):
        for col_name in self.cssDict.keys():
            self.dataDict[col_name] = self.dataDict.get(col_name, None)
        self.dataList.append(self.dataDict)
        self.dataDict = {}

    def getColName(self):
        return tuple(self.cssDict.keys())


class Crawler(BaseCrawler):
    driver: webdriver.Edge
    data: CrawlerData
    cookieSaver: CookieSaver

    def crawl(self, url: str):
        pass

    def parse(self):
        pass

    def save(self):
        with MongoClient() as client:
            db = client["Hotel"]
            collection = db["XIECHENG"]
            tuples = self.data.dataList
            for t in tuples:
                collection.update_one(t, {"$set": t}, upsert=True)

    def __init__(self, url_list: list[str], ):
        # 设置反爬参数,防止被发现是爬虫
        options = Options()
        options.add_argument('--disable-blink-features=AutomationControlled')
        options.add_argument('--ignore-certificate-errors')
        options.add_argument('--ignore-ssl-errors')
        options.add_argument(
            'user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0')
        self.driver = webdriver.Edge(options=options)
        self.urlList = url_list


def randomWait(min_time=0.5, max_time=1.5):
    time.sleep(random.uniform(min_time, max_time))


class HotelCrawler(Crawler):
    def __init__(self, url_list: list[str]):
        self.goods_css = "div.card-item-wrap"
        css_dict = {
            "title": ".list-card-title span",
            "location": "span.ads",
            "price": "span.real-price",
            "tags": "div.list-card-tag",
            "comment": "div.list-card-comment p.count",
            "score": "div.score span"
        }
        self.data = CrawlerData(css_dict)
        super().__init__(url_list)
        self.cookieSaver = CookieSaver(self.driver)

    def randomScroll(self):
        self.driver.execute_script("window.scrollBy(0,(Math.random()*0.3+0.7)*document.body.scrollHeight);")

    def parse(self):
        doc = pyquery.PyQuery(self.driver.page_source)
        goods = doc(self.goods_css).items()
        for g in goods:
            for col, css in self.data.cssDict.items():
                self.data.write(col, g(css).text())
            self.data.write("domain", self.cookieSaver.cookies.domain)
            self.data.write("time", datetime.now().date().isoformat())
            self.data.nextRow()

    def findMore(self):
        try:
            target = self.driver.find_element(By.CSS_SELECTOR, "div.list-btn-more div")
            self.driver.execute_script("arguments[0].scrollIntoView({block: 'center',inline: 'center'});", target)
            target.click()
            return True
        except Exception as e:
            return False

    def crawlAllURL(self, times=10):
        for url in self.urlList:
            self.crawl(url,times)

    def crawl(self, url: str, times=10):
        self.driver.get(url)
        self.driver.get(url)
        load = self.cookieSaver.load_cookies()
        valid = self.cookieSaver.is_cookie_valid()
        while not load or not valid:
            input("请登录后按回车键继续...")
            self.cookieSaver.save_cookies()
            load = self.cookieSaver.load_cookies()
            valid = self.cookieSaver.is_cookie_valid()
        more_times = 0
        try:
            while True:
                if self.findMore():
                    more_times += 1
                    if more_times > times:
                        break
                else:
                    self.randomScroll()
                randomWait(2.5, 3)
        except Exception as e:
            self.parse()
            self.save()
            print(f'遇到错误:{e}'
                  f'已经当前数据存储')
        self.parse()
        self.save()


if __name__ == '__main__':
    urls = [
        "https://hotels.ctrip.com/hotels/list?countryId=1&city=-1&optionId=16&optionType=Province&display=%E6%B5%99%E6%B1%9F%2C+%E4%B8%AD%E5%9B%BD",
    ]
    crawler = HotelCrawler(urls)
    crawler.crawlAllURL(100)

标签:__,酒店,携程,self,list,爬虫,str,import,def
From: https://www.cnblogs.com/wzu-hqj/p/18593758

相关文章

  • 这7个简易爬虫工具,你一定要知道!
    爬虫类工具主要两种,一种是编程语言第三方库,比如Python的scrapy、selenium等,需要有一定的代码基础,一种是图形化的web或桌面应用,比如WebScraper、后羿采集器、八爪鱼采集器、WebHarvy等,接近于傻瓜式操作,只需要按教程配置即可。这两种我用的都比较多,还算有发言权。提问者需要......
  • 新一代爬虫神器,网页解锁能力非常强大!
    在当今数据驱动型时代,数据采集和分析能力算是个人和企业的核心竞争力。然而,手动采集数据耗时费力且效率低下,而且容易被网站封禁。我之前使用过一个爬虫工具,亮数据(BrightData),是一款低代码爬虫平台,既有现成的爬虫解锁框架,还提供IP代理服务。https://get.brightdata.com/weiju......
  • Python 爬虫验证码处理方案
    Python爬虫验证码处理方案简介嗨,大家好,我是太上问情,一个学习爬虫好几年都还没有真正入门的小趴菜。本文记录本人Python爬虫学习过程中,验证码处理的各种解决方案,欢迎大家指正。本人计划在本文完成如下验证码的处理,目前一个都没有完成,希望我能很快完成!数字验证码字......
  • 【Python爬虫五十个小案例】Python提取某斗颜值主播图片~
    博客主页:小馒头学python本文专栏:Python爬虫五十个小案例专栏简介:分享五十个Python爬虫小案例前言在这个博客中,我们将详细讲解如何通过Python编写一个爬虫来从斗鱼平台抓取美女主播的图片。随着爬虫技术的普及,抓取互联网上的公开数据变得越来越容易,而斗鱼作为一个......
  • 9.爬虫案例
    爬虫案例案例1:中图网TOP1000数据爬取思路:使用request和lxml获取网页的HTML代码;解析HTML代码,获取对应标签下的文本信息;先试着爬取一页数据,再使用循环爬取多页数据。单页数据爬取importrequestsfromlxmlimportetreeimportpandasaspd#获取HTMLurl=f'https......
  • 网络爬虫~
    简介网络爬虫,也被称为网页蜘蛛、网络机器人、网页抓取器或网页追逐者,是一种自动化程序或脚本。以下是对网络爬虫的详细介绍一、定义与工作原理网络爬虫按照一定的规则自动地抓取万维网上的信息。它模拟人类用户在网页上的行为,通过发送HTTP请求获取网页内容,并解析网页内容......
  • 《爬虫+大模型》到底有没有搞头?
    最近在学习大模型,之前我是干过一段时间爬虫,在学习大模型的过程中,突发奇想能不能把大模型的能力结合爬虫,搞个AI爬虫玩一玩。说干就干,先测试一下大模型的数据提取能力<tablewidth="100%"class=""><tbody><trclass="item"><tdwidth="100"valign="top">......
  • python爬虫项目毕设:江苏南京旅游景区景点数据可视化系统开题报告
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • 如何利用PHP爬虫获得商品类目
    在当今数字化时代,获取和分析数据的能力对于任何希望在市场上保持竞争力的企业来说都是至关重要的。对于电子商务平台和市场研究公司而言,获取商品类目数据尤为重要,因为这些数据可以帮助他们更好地理解市场趋势、优化产品目录并制定有效的营销策略。什么是商品类目?商品类目是指......
  • 爬虫 - xpath
    xpath常用规则|表达式|功能||-----------|---------------------------------------------||nodename |选取此节点的所有子节点||/ |从根节点选取(取子节点)||// |从匹配的节......