import csv
from openpyxl import Workbook
from selenium.webdriver.common.by import By
from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from lxml import etree

# 创建浏览器对象
options = webdriver.FirefoxOptions()
#浏览器地址
options.add_argument('blink-settings=imagesEnabled=false')
options.binary_location = r'C:\Users\yuxin\AppData\Local\Mozilla Firefox\firefox.exe'
# options.add_argument('--headless')
options.add_argument('--diable-gpu')
browser = webdriver.Firefox(options=options)

#创建表格
workbook = Workbook()
sheet = workbook.active
headers = ['hotelName', '缤客 Booking.com', 'Expedia.com', 'Agoda.com', 'Hotels.com', 'Trip.com', 'Vio.com']
# 写入表头
sheet.append(headers)

#获取urls和hotel_names
def get_urls_from_csv(file_path):
    urls, hotels_name = [], []
    with open(file_path, 'r') as file:
        reader = csv.DictReader(file)
        for row in reader:
            urls.append(row['url'])
    with open(file_path, 'r') as file:
        reader = csv.DictReader(file)
        for row in reader:
            hotels_name.append(row['hotelName'])
    return urls, hotels_name


# browser.get('https://www.tripadvisor.com/Hotel_Review-g35805-d15113690-Reviews-Arlo_Chicago-Chicago_Illinois.html')
# 使用Selenium爬取供应商名称和价格
def crawl_data(url):
    browser.get(url)
    #browser.execute_script('window.scrollTo(0, 1.5*window.innerHeight);')
    button = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'button.UikNM:nth-child(4) > span:nth-child(1)')))  # 调整等待时间
    button.click()
    time.sleep(1)
    page_source = browser.page_source
    tree = etree.HTML(page_source)
    a_list = tree.xpath('//div[@class='XQgaU']/div/a')
    hotel_data = {}
    for a in a_list:
        name = a.xpath('./@data-vendorname')[0]
        price = a.xpath('.//div[@class='gbXAQ']/text()')[0].replace(u'\xa0', '')
        hotel_data[name] = int(''.join(price.split('B')[-1].split(',')))  # 'RMB1,293'
    return hotel_data


###### 遍历urls
url_list, hotels_name_list = get_urls_from_csv(r'C:\Users\yuxin\Desktop\TOP3000_1.csv')

# 使用多线程加速爬取
from threading import Thread

def crawl_and_save(url, hotelname):
    data = crawl_data(url)
    values = []
    for supplier in headers[1:]:  # 按照表头写入价格
        try:
            values.append(data[supplier])
        except:
            values.append(' ')
    sheet.append([hotelname] + values)
    workbook.save(r'C:\Users\yuxin\Desktop\output.xlsx')

threads = []
for url, hotelname in zip(url_list[:5], hotels_name_list[:5]):
    thread = Thread(target=crawl_and_save, args=(url, hotelname))
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

# 关闭浏览器
browser.quit()

代码优化说明:

  1. 网络延迟优化: 确保使用稳定的网络连接,并尝试使用更快的网络环境。

  2. 页面加载速度提升: 优化浏览器设置,例如禁用图片加载、禁用JavaScript等,来减少页面加载时间。

  3. 元素定位等待时间调整: 调整WebDriverWait的等待时间,根据实际情况设置更合理的等待时间。

  4. 并发爬取策略: 使用多线程来并行处理多个页面的爬取任务,例如threading.Thread,可以显著提升爬取效率。

  5. 数据存储优化: 将爬取的数据暂时存储在内存中,最后一次性写入Excel文件,可以减少文件IO操作,提高效率。

  6. XPath定位优化: 优化XPath表达式,提高元素定位的速度,尽量使用更精确的定位方式。

其他建议:

  • 使用代理服务器,可以避免IP被封禁,提高爬取稳定性。
  • 使用爬虫框架,例如Scrapy,可以更方便地进行爬虫开发和管理。
  • 使用数据库,例如MySQL或MongoDB,可以更方便地存储和管理爬取的数据。

通过以上优化方法,可以有效提升爬虫效率,更快地获取酒店价格数据。

注意:

  • 爬取数据时,请尊重网站的robots协议,避免对网站造成过大的负担。
  • 请遵守相关法律法规,不要进行违法爬取活动。

希望以上优化方法和建议能帮助您构建更高效的爬虫程序。


原文地址: https://www.cveoy.top/t/topic/pWs6 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录