Python Selenium 爬虫优化:提高 Tripadvisor 酒店价格抓取速度
"import csv\nfrom openpyxl import Workbook\nfrom selenium.webdriver.common.by import By\nfrom selenium import webdriver\nimport time\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\nfrom lxml import etree\n# 创建浏览器对象\noptions = webdriver.FirefoxOptions()\n#浏览器地址\noptions.add_argument("blink-settings=imagesEnabled=false")\noptions.binary_location = r'C:\Users\yuxin\AppData\Local\Mozilla Firefox\firefox.exe'\n# options.add_argument('--headless')\noptions.add_argument('--diable-gpu')\nbrowser = webdriver.Firefox(options=options)\n#创建表格\nworkbook = Workbook()\nsheet = workbook.active\nheaders = ['hotelName','缤客 Booking.com', 'Expedia.com', 'Agoda.com', 'Hotels.com', 'Trip.com', 'Vio.com']\n# 写入表头\nsheet.append(headers)\n\n#获取urls和hotel_names\ndef get_urls_from_csv(file_path):\n urls,hotels_name = [],[]\n with open(file_path, 'r') as file:\n reader = csv.DictReader(file)\n for row in reader:\n urls.append(row['url'])\n with open(file_path, 'r') as file:\n reader = csv.DictReader(file)\n for row in reader:\n hotels_name .append(row['hotelName'])\n return urls,hotels_name\n\n\n# browser.get("https://www.tripadvisor.com/Hotel_Review-g35805-d15113690-Reviews-Arlo_Chicago-Chicago_Illinois.html")\n# 使用Selenium爬取供应商名称和价格\ndef crawl_data(url):\n browser.get(url)\n time.sleep(2)\n #browser.execute_script("window.scrollTo(0, 1.5*window.innerHeight);")\n a=browser.find_element(By.CSS_SELECTOR,'button.rmyCe:nth-child(2)')\n a.click()\n time.sleep(2)\n b=browser.find_element(By.CSS_SELECTOR,'.gUFiK > div:nth-child(1)')\n b.click()\n time.sleep(2)\n c=browser.find_element(By.CSS_SELECTOR,'button.UikNM:nth-child(4) > span:nth-child(1)')\n c.click()\n time.sleep(3)\n page_source=browser.page_source\n tree=etree.HTML(page_source)\n a_list=tree.xpath('//div[@class="XQgaU"]/div/a')\n hotel_data={} \n for a in a_list:\n name=a.xpath('./@data-vendorname')[0]\n price=a.xpath('.//div[@class="gbXAQ"]/text()')[0].replace(u'\xa0', '')\n hotel_data[name]=int("".join(price.split('B')[-1].split(','))) #'RMB1,293'\n return hotel_data\n\n###### 遍历urls\nurl_list,hotels_name_list=get_urls_from_csv(r"C:\Users\yuxin\Desktop\TOP3000_1.csv")\nfor url,hotelname in zip(url_list[:5],hotels_name_list[:5]):\n data = crawl_data(url) \n print(data)\n values=[]\n for supplier in headers[1:]: #按照表头写入价格\n try:\n values.append(data[supplier])\n except:\n values.append(" ") #没有的供应商就是空\n sheet.append([hotelname]+values) \n workbook.save(r"C:\Users\yuxin\Desktop\output.xlsx")\n这个爬虫太慢了怎么改进,如何尽可能加载出来少的信息,只要必须的内容:这个爬虫可以通过以下方式进行改进来提高速度:\n\n1. 使用无头浏览器:将浏览器设置为无头模式,即不显示浏览器窗口,可以节省资源和加载时间。在创建浏览器对象时,添加options.add_argument('--headless')即可。\n\n2. 设置页面加载策略:通过设置pageLoadStrategy参数来调整页面加载策略,可以选择normal、eager或none,默认为normal。根据需求选择合适的加载策略,可以通过options.add_argument('--pageLoadStrategy=none')来设置。\n\n3. 使用显示等待:使用WebDriverWait类来等待页面元素的出现,而不是使用固定的时间延迟。可以通过EC.presence_of_element_located来等待元素出现,例如:\npython\nelement = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'div.XQgaU')))\n\n\n4. 避免不必要的操作:例如不需要点击按钮或选择选项的操作,可以直接跳过,节省时间。\n\n5. 减少网络请求:可以通过禁用图片加载、CSS或JavaScript来减少网络请求,可以在创建浏览器对象时添加相应的参数,例如options.add_argument("blink-settings=imagesEnabled=false")。\n\n6. 合理使用缓存:通过设置合适的浏览器缓存策略,可以减少网络请求。可以使用options.add_argument("--disk-cache-size=0")来禁用缓存。\n\n7. 并发请求:使用多线程或异步请求来同时进行多个请求,提高爬取速度。\n\n通过以上方法的组合使用,可以尽可能地加载少的信息,从而提高爬取速度。需要根据具体情况进行调整和优化。\n
原文地址: https://www.cveoy.top/t/topic/pWuh 著作权归作者所有。请勿转载和采集!