失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > (4 Selenium抓取电商网站数据)Python爬虫与数据清洗的进化

(4 Selenium抓取电商网站数据)Python爬虫与数据清洗的进化

时间:2022-09-07 17:27:08

相关推荐

(4 Selenium抓取电商网站数据)Python爬虫与数据清洗的进化

1、使用Selenium模块爬取去哪儿网度假信息,此文笔者主要使用XPATH进行节点元素定位。

2、首先selenium使用需要安装对应浏览器的驱动,并将驱动放入浏览器根目录,并将驱动路径加入系统环境变量。ok开始吧!

以下是笔者写的例子,后面具体会讲解每个部分的作用和容易出现的坑。

import requests,urllib.request,time,randomfrom selenium import webdriverfrom mon.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdef get_url(url):time.sleep(2)return(requests.get(url))if __name__=='__main__':driver=webdriver.Firefox()url = 'https://m./depCities.qunar'strhtml = get_url(url)dep_dict = strhtml.json()a=[]for dep_item in dep_dict['data']:for dep in dep_dict['data'][dep_item]:a.append(dep)for dep_1 in a[1:]:strhtml = get_url('https://m./golfz/sight/arriveRecommend?dep={}&exclude=&extensionImg=255,175'.format(urllib.request.quote(dep_1)))arrive_dict = strhtml.json()for arr_item in arrive_dict['data']:for arr_item_1 in arr_item['subModules']:for query in arr_item_1['items']:driver.get('https://fh./?tf=package')WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "depCity")))driver.find_element_by_xpath('//*[@id="depCity"]').clear()driver.find_element_by_xpath('//*[@id="depCity"]').send_keys(dep_1)driver.find_element_by_xpath('//*[@id="arrCity"]').send_keys(query['query'])driver.find_element_by_xpath('/html/body/div[2]/div[1]/div[2]/div[3]/div/div[2]/div/a').click()print('dep:%s arr:%s' % (dep_1, query['query']))for i in range(100):time.sleep(random.uniform(5, 6))wrong = driver.find_elements_by_xpath('/html/body/div[2]/div[2]/div[6]/div[2]/div')if wrong == []:breakroutes = driver.find_elements_by_xpath('/html/body/div[2]/div[2]/div[6]/div[2]/div')for route in routes:result = {'date': time.strftime('%Y-%m-%d', time.localtime(time.time())),'dep': dep_1,'arrive': query['query'],'result': route.text}print(result)if i < 1:btns = driver.find_elements_by_xpath('/html/body/div[2]/div[2]/div[7]/div/div/a')for a in btns:if a.text == u"下一页":a.click()breakelse:breakdriver.close()exit()

0x01:使用selenium的webdriver库,初始化一个火狐浏览器对象。弹出一个火狐浏览器窗口。

from selenium import webdriverdriver=webdriver.Firefox()

0x02:使用get方法打开网页

driver.get('https://fh./?tf=package')

0x03:实现等待需要用到下面三个库:By库用于指定HTML文件中DOM标签元素;WebDriverWait库用于等待网页加载完成;expected_conditions库(下面用as EC作为这个库的简称)用于指定网页加载结束的条件。这里的输入框是异步加载的,需要一定时间,所以需要写一条等待语句。此处等待id="depCity"的出现。

WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, "depCity")))

0x04:接下来如果搜索不出产品怎么办呢,此处使用以下代码,如果内容块没有信息,则break到下一地址。

wrong = driver.find_elements_by_xpath('/html/body/div[2]/div[2]/div[6]/div[2]/div')if wrong == []:break

0x05:这一部分作用是设置页码,因为i属于(0,100),所以此处只翻一次页。然后break到下一地址。

if i < 1:btns = driver.find_elements_by_xpath('/html/body/div[2]/div[2]/div[7]/div/div/a')for a in btns:if a.text == u"下一页":a.click()break

主要注意的是 driver.find_elements_by_xpath是查找可迭代的dom节点,driver.find_element_by_xpath查找不可迭代的dom节点。中文字符串前面加u是规定使用utf-8编码,避免出错。以及学习一下break的用法。

如果觉得《(4 Selenium抓取电商网站数据)Python爬虫与数据清洗的进化》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。