from selenium import webdriver import time from lxml import etree import csv def get_driver(): driver = webdriver.Chrome() return driver def get_page_source(driver, url): driver.get(url) ##函数睡眠1秒,等待网页响应和渲染 time.sleep(1) page_source = driver.page_source return page_source def get_xhtml(page_source): xhtml = etree.HTML(page_source) return xhtml ## 这是一个生成器函数 def parse_datas(xhtml, city): datas = {} items = xhtml.xpath('//article[@class="poi-item"]') for item in items: datas['city'] = city datas['hotel'] = item.xpath('.//a[@class="poi-title"]/text()')[0].strip() datas['price'] = 111#item.xpath('.//div[@class="poi-price"]/em/text()')[0].strip() datas['grade'] = item.xpath('.//div[@class="poi-grade"]/text()')[0].strip() ## 部分酒店没有消费人数的信息,如果没有,返回空字符串 try: datas['consumer'] = item.xpath('.//div[@class="poi-buy-num"]/text()')[0].strip() except IndexError: datas['consumer'] = '' datas['address'] = item.xpath('.//div[@class="poi-address"]/text()')[0].strip() yield datas def save_datas(datas): with open('hotel.csv', 'a', encoding='GB18030', newline='') as c: fieldnames = ['city', 'hotel', 'price', 'grade', 'consumer', 'address'] writer = csv.DictWriter(c, fieldnames=fieldnames) for data in datas: writer.writerow(data) if __name__ == '__main__': city = '广州' url = 'https://hotel.meituan.com/guangzhou/' driver = get_driver() page_source = get_page_source(driver, url) xhtml = get_xhtml(page_source) datas = parse_datas(xhtml ,city) save_datas(datas) driver.quit()