#使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息
 # 思路:
 # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表
 # 第二步:分析商品页数,驱动浏览器翻页,并得到商品信息
 # 第三步:爬取商品信息
 # 第四步:存储到mongodb
 import re
 from selenium import webdriver
 from selenium.common.exceptions import TimeoutException
 from selenium.webdriver.common.by import By
 from selenium.webdriver.support.ui import WebDriverWait
 from selenium.webdriver.support import expected_conditions as EC
 from pyquery import PyQuery as pq
 from config import *
 import pymongo

 client = pymongo.MongoClient(MONGO_URL)
 db = client[MONGO_DB]
 # 声明浏览器对象,这里定为Chrome
 # browser = webdriver.Chrome()
 # 声明浏览器对象,可以使用PhanttomJS,这是无界面浏览器,可以设置不加载图片,启用缓存等加快速度
 browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)  # 在配置文件设定参数

 browser.set_window_size(1400, 900)  # 默认的窗口比较小,为避免影响操作需设定

 # 传入搜索关键词并搜索
 # 在这里,需要等待搜索框与搜索按钮加载出来完毕,方可传入关键词,并点击搜索
 wait = WebDriverWait(browser, 10)  # 表示给browser浏览器一个10秒的加载时间

 def search():
     print('正在搜索……')
     try:
         # 驱动浏览器打开网页
         browser.get('https://www.taobao.com/')
         input = wait.until(EC.presence_of_element_located((By.ID, 'q')))  # 表示在规定时间内等待,直到id为q的元素加载出来,注意传入的是元组
         input.send_keys(KEYWORDS)
         # 同样的道理,搜索的按钮也需要等待,直到按钮加载出来,是可以点击的
         button = wait.until(EC.element_to_be_clickable(
             (By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))  # 表示规定时间内,搜索按钮是否是可点击的
         button.click()
         #页面加载完成后,找到总页数
         total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))

         get_product()
         return total.text
     except TimeoutException:
         return search()

     # # 得到当前页面的html
     # html = browser.page_source

 def next_page(page_number):
     print('正在翻页……')
     try:
         #等待页码框加载完成
         input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input')))

         #等待确定按钮可点击,然后点击
         button  = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))

         # 清空并输入页码
         input.clear()
         input.send_keys(page_number)

         button.click()

         #检查当前页是否切换 text_to_be_present_in_element 某个元素文本包含某文字
         wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > ul > li.item.active > span'),str(page_number)))

         get_product()
     except TimeoutException:
         next_page(page_number)

 def get_product():
     wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist > div')))
     html = browser.page_source
     doc = pq(html)
     lis = doc('#mainsrp-itemlist .items .item').items()
     for item in lis:
         product={
             'title':item.find('.title').text(),#find方法是为了嵌套找出来,防止遗漏
             'price':item.find('.price').text(),
             'deal':item.find('.deal-cnt').text(),
             'shop':item.find('.shop').text(),
             'location':item.find('.location').text(),
             'image':item.find('.pic .img').attr('src')
         }
         print(product)
       #return product #终于找到问题所在了,谨慎使用return啊,因为函数遇到return就会返回!,不再进行循环了 save_to_mongo(product) def save_to_mongo(result): try: if db[MONGO_TABLE].insert(result): print('保存到MONGODB成功',result) except Exception: print('保存到MONGODB失败',result) def main(): try: total = search() total = int(re.compile(r'(\d+)').search(total).group(1))#正则提取页数 for page_number in range(2,total + 1): next_page(page_number) except Exception: print('出错了') finally: browser.close() if __name__=='__main__': main() #配置文件 MONGO_URL = 'localhost' MONGO_DB = 'taobao' MONGO_TABLE = 'product' SERVICE_ARGS =['--disk-cache=true','--load-images=false'] KEYWORDS = '美食'

Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息的更多相关文章

  1. 3.使用Selenium模拟浏览器抓取淘宝商品美食信息

    # 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...

  2. Selenium模拟浏览器抓取淘宝美食信息

    前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...

  3. 利用Selenium爬取淘宝商品信息

    一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...

  4. python3编写网络爬虫16-使用selenium 爬取淘宝商品信息

    一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...

  5. <day003>登录+爬取淘宝商品信息+字典用json存储

    任务1:利用cookie可以免去登录的烦恼(验证码) ''' 只需要有登录后的cookie,就可以绕过验证码 登录后的cookie可以通过Selenium用第三方(微博)进行登录,不需要进行淘宝的滑动 ...

  6. 爬取淘宝商品信息,放到html页面展示

    爬取淘宝商品信息 import pymysql import requests import re def getHTMLText(url): kv = {'cookie':'thw=cn; hng= ...

  7. 16-使用Selenium模拟浏览器抓取淘宝商品美食信息

    淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...

  8. Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息

    学习目的: selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的 正式步骤 需求背景:抓取淘宝美食 Step1:流程分析 搜索关键字 ...

  9. 使用Selenium模拟浏览器抓取淘宝商品美食信息

    代码: import re from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...

随机推荐

  1. Javscript的垃圾回收

    和C#.Java一样JavaScript有自动垃圾回收机制,也就是说执行环境会负责管理代码执行过程中使用的内存,在开发过程中就无需考虑内存分配及无用内存的回收问题了.JavaScript垃圾回收的机制 ...

  2. PAT 个位数统计

    描述 给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个 ...

  3. Bootstrap3 datetimepicker控件的使用

    Bootstrap3 日期+时间选择控件 1.支持日期选择,格式设定 2.支持时间选择 3.支持时间段选择控制 4.支持中文 官网地址:http://eonasdan.github.io/bootst ...

  4. C++标准库vector类型的使用和操作总结

    vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...

  5. Sublime Text、webstorm等编译器快速编写HTML/CSS代码的技巧

    Sublime Text.webstorm等编译器,如果你从事Web前端开发的话,对这几款软件一定不会陌生.它使用仿CSS选择器的语法来生成代码,大大提高了HTML/CSS代码编写的速度,比如下面的演 ...

  6. Struts2 之 Action 类访问 WEB 资源

    接着上次博客的内容我继续分享我所学到的知识,和自己在学习过程中所遇到问题以及解决方案.当然,如果读者发现任何问题均可以在下方评论告知我,先谢! 在 Action 中访问 WEB 资源 web 资源 所 ...

  7. vs连接Oracle 客户端库时引发 BadImageFormatException

    报错:Oracle 客户端库时引发 BadImageFormatException如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式? 解决方案:http://www.cnblog ...

  8. 关于yaml语言

    yaml语言广泛用于书写配置文件. 主要特点如下: 1.使用缩进表示层级关系,缩进使用空格键(非Tab键) 2.缩进的空格数目不要求,只要相同层级的元素左侧对其即可 3.#之后的内容为注释 4.yam ...

  9. 用 Go 编写一个简单的 WebSocket 推送服务

    用 Go 编写一个简单的 WebSocket 推送服务 本文中代码可以在 github.com/alfred-zhong/wserver 获取. 背景 最近拿到需求要在网页上展示报警信息.以往报警信息 ...

  10. 简易web服务器

    当通过Socket开发网络应用程序的时候,首先需要考虑所使用的网络类型,主要包括以下三个方面: 1)Socket类型,使用网络协议的类别,如IPv4的类型为PF_INET. 2)数据通信的类型,常见的 ...