准备:
1.安装Selenium:终端输入 pip install selenium
2.安装下载Chromedriver:解压后放在…\Google\Chrome\Application\;如果是Mac,可放入/usr/locl/bin,并将此目录放入环境变量
3.安装pyquery:终端输入 pip install pyquery
4.安装pymongo:终端输入 pip install pymongo
5.安装MongoDB的PyCharm插件:Preferences——Plugins——Mongo Plugin,安装完成后重启PyCharm可发现右侧有Mongo Explorer
6.安装MongoDB,windows:参考小歪老师知乎专栏MongoDB及可视化工具的安装;mac:参考 Mac OSX 平台安装 MongoDB安装
注:有时pip安装后,PyCharm中无法识别,首先确认编译器地址是否正确Preferences---Project interpreter;如果还不行,可在PyCharm下Preferences---Project interpreter重新添加包
基于:python3.6
遇到的坑:
1.定位搜索框元素的时候,查找对象路径,在点完搜索按钮后的页面得到(正确应该在淘宝首页获取),结果运行的时候,怎么都获取不到这个对象;所以:获取元素的时候,一定要在正确的页面查找该元素位置
2.翻页,10页以前的页码链接定位中规中矩,10页以后分奇偶,奇数用#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a定位;偶数用#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a定位,具体见源码
以下是源码,参考了很多DC 学院《Python爬虫(入门+进阶)》1-7,1-8课程内容,这算不算硬广:p
#!/usr/bin/python# -*- coding:utf-8 -*- from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ecfrom selenium.webdriver.common.by import Byfrom pyquery import PyQuery as pqimport reimport timefrom pymongo import MongoClient as mc driver = webdriver.Chrome() #打开Chrome浏览器wait = WebDriverWait(driver, 10) # 获取总页数def search(): try: driver.get(‘https://www.taobao.com‘) # 获取搜索关键字输入框 input = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, ‘#q‘))) # 获取搜索按钮 search = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, ‘#J_TSearchForm > div.search-button > button‘)),‘not find element‘) # 输入关键字 input.send_keys(u‘鞋子‘) # 点搜索 search.click() # 获取总页数 page_total = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, ‘#mainsrp-pager > div > div > div > div.total‘)),‘not find element‘) # 调用方法获取首页产品概要 get_products() return page_total.text except Exception as ex: print(ex) # 翻页def page(pagenum): try: # 页数小于10,直接按页数定位 if(pagenum < 10): css = ‘#mainsrp-pager > div > div > div > ul > li:nth-child({}) > a‘.format(pagenum) else: # 页数大于10,如果是偶数,按nth-child(9)定位 if (pagenum%2==0): css = ‘#mainsrp-pager > div > div > div > ul > li:nth-child(9) > a‘ # 页数大于10,如果是奇数,按nth-child(8)定位 else: css = ‘#mainsrp-pager > div > div > div > ul > li:nth-child(8) > a‘ # 获取页码链接 link = wait.until(ec.element_to_be_clickable((By.CSS_SELECTOR, css)), ‘not find element‘) # 点击页码链接 link.click() time.sleep(1) # 调用方法获取产品概要 get_products() except Exception as ex: print(ex) # 获取每页产品概要数据def get_products(): # 所有产品项位置 pb = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, ‘#mainsrp-itemlist .items .item‘)), ‘ not find element‘) html = driver.page_source doc = pq(html) # 获取所有产品项数据 items = doc(‘#mainsrp-itemlist .items .item‘).items() # 轮询每个产品 for item in items: product = { # 产品图片链接 ‘image‘: item.find(‘.pic .img‘).attr(‘src‘), # 产品价格 ‘price‘: item.find(‘.price‘).text(), # 付款人数 ‘deal‘: item.find(‘.deal-cnt‘).text(), # 产品主题 ‘title‘: item.find(‘.title‘).text(), # 产品商店 ‘shop‘: item.find(‘.shop‘).text(), # 产品所在地 ‘location‘: item.find(‘.location‘).text(), } # print(product[‘title‘]) # 入MongoDB库 client =mc() db = client.taobao set = db.xiezi set.insert(product) if __name__ == ‘__main__‘: # 获取总页数 page_total = search() # 获取int 总页数 pagenum = int(re.compile(‘(\d+)‘).search(page_total).group(1)) # 轮询页码,获取产品概要;测试需要,只取15页 for i in range(3, 15): print(str(i)+‘:‘) page(i) driver.quit()
原文地址:https://www.cnblogs.com/syhshare/p/10560824.html