爬虫实战4:用selenium爬取淘宝美食
方案1:一次性爬取全部淘宝美食信息
1. spider.py文件如下
- __author__ = 'Administrator'
- from selenium import webdriver
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support.ui import WebDriverWait
- from selenium.webdriver.support import expected_conditions as EC
- import re
- from pyquery import PyQuery as pq
- from config import *
- import pymongo
- client = pymongo.MongoClient(MONGO_URL)
- db = client[MONGO_DB]
- browser = webdriver.Chrome()
- """
- 如果把Chrome修改为使用PhantomJS
- 1. 首先需要安装phantomJS
- 2. 自定义一些配置参数,这里不加载图片以及使用缓存
- browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
- 3. 设置窗口大小
- browser.set_window_size(1400,900)
- """
- wait = WebDriverWait(browser, 10) #显示等待10秒再查找目标元素
- def search():
- # print('正在搜索') 用于phantomJS调试
- try:
- browser.get('https://www.taobao.com')
- input1 = wait.until(
- EC.presence_of_element_located((By.CSS_SELECTOR, '#q')) #定位搜索框
- )
- submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button'))) #定位搜索按钮
- # 这里的美食可以替换为配置文件中的变量KEYWORD
- input1.send_keys('KEYWORD')
- submit.click()
- total = wait.until(
- EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total'))) #定位总页数,使用右键copy selector的方法找出参数名
- # 调用get_products
- get_products()
- return total.text
- except TimeoutError:
- return search()
- # 使用翻页输入框来翻页
- def next_page(page_number):
- # print('正在翻页',page_number) 用于phantomJS调试
- try:
- input1 = wait.until(
- EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input'))
- )
- submit = wait.until(
- EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit'))
- )
- input1.clear()
- input1.send_keys(page_number)
- submit.click()
- # 根据选择页面会高亮这个条件,来判断是否成功跳转
- 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_products()
- get_products()
- except TimeoutError:
- next_page(page_number)
- # 解析信息
- def get_products():
- wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))
- html = browser.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()[:-3],
- 'title': item.find('.title').text(),
- 'shop': item.find('.shop').text(),
- 'location': item.find('.location').text()
- }
- print(product)
- # 保存数据到mongodb
- save_to_mongo(product)
- # 定义一个保存到mongodb的方法
- def save_to_mongo(result):
- try:
- if db[MON_TABLE].insert(result):
- print('存储到MONGODB成功', result)
- except Exception:
- print('存储到MONGODB失败', result)
- def main():
- try:
- # 输出100数字
- total = search()
- total = int(re.compile('(\d+)').search(total).group(1))
- # 调用翻页函数
- for i in range(2, total + 1):
- next_page(i)
- except Exception:
- print('出错了')
- finally:
- browser.close()
- if __name__ == '__main__':
- main()
2. config.py
- __author__ = 'Administrator'
- MONGO_URL = 'localhost'
- MONGO_DB = 'taobao'
- MON_TABLE = 'product'
- # 配置phantomJS
- SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
- KEYWORD = '美食'
方案2:上面这种方法经测试可正常运行,但是会一次性爬取全部数据,数据量较大且不能灵活控制抓取内容,下面代码基本实现方法如下
1. 把搜索的关键字直接放在url中
2. 分页抓取商品信息
3. 使用chrome的headless功能
- import pymongo
- from selenium import webdriver
- from selenium.common.exceptions import TimeoutException
- from selenium.webdriver.common.by import By
- from selenium.webdriver.support import expected_conditions as EC
- from selenium.webdriver.support.wait import WebDriverWait
- from pyquery import PyQuery as pq
- from config import *
- from urllib.parse import quote
- # browser = webdriver.Chrome()
- # browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
- chrome_options = webdriver.ChromeOptions()
- chrome_options.add_argument('--headless')
- browser = webdriver.Chrome(chrome_options=chrome_options)
- wait = WebDriverWait(browser, 10)
- client = pymongo.MongoClient(MONGO_URL)
- db = client[MONGO_DB]
- def index_page(page):
- """
- 抓取索引页
- :param page: 页码
- """
- print('正在爬取第', page, '页')
- try:
- url = 'https://s.taobao.com/search?q=' + quote(KEYWORD)
- browser.get(url)
- if page > 1:
- #定位页码输入框
- input = wait.until(
- EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input')))
- ##定位页码跳转确定按钮
- submit = wait.until(
- EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit')))
- input.clear()
- input.send_keys(page)
- submit.click()
- """
- 验证是否跳转到对应的页码
- 只需要判断当前高亮的页码数是当前的页码数即可,可使用等待条件text_to_be_present_in_element,它会等待指定的文本出现在某一节点里面时即返回成功
- 我们将高亮的页面节点对应的css选择器和当前要跳转的页面作为这个等待条件的参数,那么这个等待条件就会检测此页码节点是否为指定的页码数
- """
- wait.until(
- EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page)))
- #等待商品信息加载,选择器'.m-itemlist .items .item'对应的页面内容就是每个商品的信息,如果加载成功,执行get_products()
- wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item')))
- get_products()
- except TimeoutException:
- index_page(page)
- #解析商品列表
- def get_products():
- """
- 提取商品数据
- """
- html = browser.page_source
- doc = pq(html)
- items = doc('#mainsrp-itemlist .items .item').items()
- for item in items:
- product = {
- 'image': item.find('.pic .img').attr('data-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)
- save_to_mongo(product)
- def save_to_mongo(result):
- """
- 保存至MongoDB
- :param result: 结果
- """
- try:
- if db[MONGO_COLLECTION].insert(result):
- print('存储到MongoDB成功')
- except Exception:
- print('存储到MongoDB失败')
- def main():
- """
- 遍历每一页
- """
- for i in range(1, MAX_PAGE + 1):
- index_page(i)
- browser.close()
- if __name__ == '__main__':
- main()
对应的配置文件如下
- MONGO_URL = 'localhost'
- MONGO_DB = 'taobao'
- MONGO_COLLECTION = 'products'
- KEYWORD = 'ipad'
- MAX_PAGE = 100
- SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
爬虫实战4:用selenium爬取淘宝美食的更多相关文章
- 利用Selenium爬取淘宝商品信息
一. Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样.由于这个性质,Selenium也是一 ...
- python3编写网络爬虫16-使用selenium 爬取淘宝商品信息
一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...
- PYTHON 爬虫笔记十:利用selenium+PyQuery实现淘宝美食数据搜集并保存至MongeDB(实战项目三)
利用selenium+PyQuery实现淘宝美食数据搜集并保存至MongeDB 目标站点分析 淘宝页面信息很复杂的,含有各种请求参数和加密参数,如果直接请求或者分析Ajax请求的话会很繁琐.所以我们可 ...
- Selenium爬取淘宝商品概要入mongodb
准备: 1.安装Selenium:终端输入 pip install selenium 2.安装下载Chromedriver:解压后放在…\Google\Chrome\Application\:如果是M ...
- 使用Selenium爬取淘宝商品
import pymongo from selenium import webdriver from selenium.common.exceptions import TimeoutExceptio ...
- 【Python爬虫案例学习】Python爬取淘宝店铺和评论
安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动sel ...
- 使用scrapy+selenium爬取淘宝网
--***2019-3-27测试有效***---- 第一步: 打开cmd,输入scrapy startproject taobao_s新建一个项目. 接着cd 进入我们的项目文件夹内输入scrapy ...
- 【Python爬虫案例学习】python爬取淘宝里的手机报价并以价格排序
第一步: 先分析这个url,"?"后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data, 关键字用字典的形式传进去,这 ...
- 关于爬虫的日常复习(10)—— 实战:使用selenium模拟浏览器爬取淘宝美食
随机推荐
- SpringMvc配置拦截器
SpringMVC可以通过配置拦截器,进行url过滤等处理. 在spring-mvc.xml的配置文件中,如下示: 其中,在<mvc:interceptors>中可以配置多个拦截器< ...
- 在windows下安装python包管理器pip及使用
从来没有在Windows下用过pip,今天试了下,原来pip也可以在Windows下安装,使用也和Linux下一样简单. 先从下面的地址下载pip源码: http://pypi.python.or ...
- Linux内核分析 - 网络[十四]:IP选项
Linux内核分析 - 网络[十四]:IP选项 标签: linux内核网络structsocketdst 2012-04-25 17:14 5639人阅读 评论(1) 收藏 举报 分类: 内核协议栈 ...
- 配置yum源方法,以及失效时的处理
正常方法如下: step1: 备份原CentOS-Base.repo 文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- VC++知识点整理
1.内联函数 定义:定义在类体内的成员函数,即函数的函数体放在类体内 特点:在调用处用内联函数体的代码来替换,用于解决程序的运行效率问题.一定要在调用之前定义,并且内联函数 ...
- Java 设计模式系列(十二)代理模式
Java 设计模式系列(十二)代理模式 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. package com.github.binarylei.de ...
- Linux中bash编程
bash编程也叫shell编程 预定义变量 $? 最后一次执行的命令的返回状态.如果这个变量的值为0,证明上一个命令正确的执行:如果这个变量返回的值非0(具体是那个数,有命令自己来决定 ...
- Swift实现UIKit Dynamic动画
iOS7引入了UIKit Dynamics,可以帮助开发者开发出更接近真实世界的动画效果.之前,用户如果要做出这样的效果,需要话很多的时间在物理计算和Core Animation上.现在,所有的一切都 ...
- Android如何判断当前手机是否正在播放音乐,并获取到正在播放的音乐的信息
我想实现如下的场景,判断当前Android手机上是否正在播放音乐,如果是,通过某个特定的手势, 或者点击某个按键,将当前我正在听的音乐共享出去. 第一步,就是判断当前是否有音乐正在播放. 最开始我想得 ...
- VC++中MessageBox的常见用法详解
消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合. 1.MessageBox("这是一个最简单的消息框!"); ...