Python爬虫优化:使用Selenium、XPath和多线程加速爬取酒店价格
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()
代码优化说明:
-
网络延迟优化: 确保使用稳定的网络连接,并尝试使用更快的网络环境。
-
页面加载速度提升: 优化浏览器设置,例如禁用图片加载、禁用JavaScript等,来减少页面加载时间。
-
元素定位等待时间调整: 调整
WebDriverWait的等待时间,根据实际情况设置更合理的等待时间。 -
并发爬取策略: 使用多线程来并行处理多个页面的爬取任务,例如
threading.Thread,可以显著提升爬取效率。 -
数据存储优化: 将爬取的数据暂时存储在内存中,最后一次性写入Excel文件,可以减少文件IO操作,提高效率。
-
XPath定位优化: 优化XPath表达式,提高元素定位的速度,尽量使用更精确的定位方式。
其他建议:
- 使用代理服务器,可以避免IP被封禁,提高爬取稳定性。
- 使用爬虫框架,例如Scrapy,可以更方便地进行爬虫开发和管理。
- 使用数据库,例如MySQL或MongoDB,可以更方便地存储和管理爬取的数据。
通过以上优化方法,可以有效提升爬虫效率,更快地获取酒店价格数据。
注意:
- 爬取数据时,请尊重网站的robots协议,避免对网站造成过大的负担。
- 请遵守相关法律法规,不要进行违法爬取活动。
希望以上优化方法和建议能帮助您构建更高效的爬虫程序。
原文地址: https://www.cveoy.top/t/topic/pWs6 著作权归作者所有。请勿转载和采集!