最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多。直接用selenium+PhantomJS 抓取淘宝搜索商品,快速完成。

#-*- coding:utf-8 -*-
__author__ =''
import logging
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
import time,re
from tqdm import tqdm
from pyquery import PyQuery as pq
from tianmao.data_tmall import keywords
from dbutils import mysql_util
from config import retry_count
"""
抓取天猫,
"""
logging.basicConfig(level=logging.INFO,
format='%(asctime)s [%(levelname)s] [%(filename)s] [%(threadName)s] [line:%(lineno)d] [%(funcName)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S') class tianmao_spider(object): def __init__(self):
self.SERVICE_ARGS = ['--disk-cache=true','--load-images=false']
self.target_url ='https://www.tmall.com/'
self.browser = webdriver.PhantomJS(service_args=self.SERVICE_ARGS)
self.wait = WebDriverWait(self.browser, 10) #设置10秒超时
self.browser.set_window_size(1400, 900)
# self.browser.add_cookie()
self.mysql_util = mysql_util() def search(self, category, keyword, page=2):
print('正在搜索:{0}'.format(keyword))
total = 0
for i in range(0, retry_count): #重试3次,3次不成功则跳过
try:
self.browser.get(self.target_url)
input = self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#mq"))
)
submit = self.wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, '#mallSearch > form > fieldset > div > button')))
input.send_keys(keyword)
submit.click()
total = self.wait.until(
EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#content > div > div.ui-page > div > b.ui-page-skip > form')))
if page == 2: # 从首页开始抓取
self.get_products(category, keyword)
total = int(re.compile('(\d+)').search(total[0].text).group(1))
break
except TimeoutException as e:
logging.info("正在重试第{0}次,出现:{1}".format(i + 1, e))
if i == retry_count - 1: # 将类目和搜索关键字按字典写入txt
f = open('tmall_retry_crawl.txt', 'a', encoding='utf-8')
f.write(category + ":" + keyword + '\n')
time.sleep(1)
return total def get_products(self, category, keyword):
self.wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#J_ItemList')))
html = self.browser.page_source
doc = pq(html)
items = doc('#J_ItemList .product').items()
for item in items:
#下载图片
img_url = item.find('img').attr('src') if item.find('img').attr('src') != None else item.find(
'img').attr('data-src')
if img_url != None:
if not str(img_url).startswith("http"):
img_url = 'http:{0}'.format(img_url)
img_save_path = '' #IMG_PATH + '/{0}.jpg'.format(uuid.uuid4())
#download_img(img_url, img_save_path)
#获取详情页面
item_url = item.find('a').attr('href')
logging.info('详情页面url:{0}'.format(item_url))
if item_url == None:
item_detail = ''
else:
if not str(item_url).startswith('http'):
item_url = "https:" + item_url
# item_detail = get_item_detail(item_url)
item_detail = ''
#保存到MySQL
product = {
'target': 'tmall',
'category': category,
'keyword': keyword,
'item_url': item_url,
'image_url': img_url,
'image_save_path': img_save_path, #div:nth-child(3) >
'title': item.find('div > div.productTitle').text(),
'price': item.find('div > p.productPrice').text(),
'deal': item.find('div > p.productStatus').text().replace('阿里旺旺','').strip(),
'shop': item.find('div > div.productShop').text(),
'location': '',
'item_detail': item_detail,
'create_time': time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) }
self.mysql_util.sava_to_mysql('t_tmall', product) def next_page(self, page_number, category, keyword):
for i in range(0, retry_count): #重试3次
try:
input = self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#content > div > div.ui-page > div > b.ui-page-skip > form > input.ui-page-skipTo"))
)
submit = self.wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, '#content > div > div.ui-page > div > b.ui-page-skip > form > button')))
input.clear()
input.send_keys(page_number)
submit.click()
self.wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, '#content > div > div.ui-page > div > b.ui-page-skip > form > button')))
self.get_products(category, keyword)
break
except TimeoutException as e:
logging.info(e)
time.sleep(0.5)
# self.next_page(page_number, category, keyword) def start_crawler(self, page=2):
try:
for category in keywords.keys():
keyword_list = keywords[category]
for keyword in keyword_list:
total = self.search(category, keyword, page=page)
# total = int(re.compile('(\d+)').search(total).group(1))
for i in tqdm(range(page, total + 1)):
print('总共{0}页,正在翻第{1}页,抓取类别:{2},搜索关键字:{3}'.format(total, i, category, keyword))
self.next_page(i, category, keyword)
if page != 2: # 下一个产品必须从第二页开始抓取,中断后可以直接从中断页继续抓取
page = 2
time.sleep(0.5)
except Exception as e:
print(e)
finally:
self.browser.close() if __name__ == '__main__':
tmall = tianmao_spider()
tmall.start_crawler()

selenium+PhantomJS 抓取淘宝搜索商品的更多相关文章

  1. selenium+chrome抓取淘宝搜索抓娃娃关键页面

    最近迷上了抓娃娃,去富国海底世界抓了不少,完全停不下来,还下各种抓娃娃的软件,梦想着有一天买个抓娃娃的机器存家里~.~ 今天顺便抓了下马爸爸家抓娃娃机器的信息,晚辈只是觉得翻得手酸,本来100页的数据 ...

  2. 使用selenium抓取淘宝的商品信息

    淘宝的页面大量使用了js加载数据,所以采用selenium来进行爬取更为简单,selenum作为一个测试工具,主要配合无窗口浏览器phantomjs来使用. import re from seleni ...

  3. selenium+chrome抓取淘宝宝贝-崔庆才思路

    站点分析 源码及遇到的问题 在搜索时,会跳转到登录界面 step1:干起来! 先取cookie step2:载入cookie step3:放飞自我 关于phantomJS浏览器的问题 源码 站点分析 ...

  4. 一个小demo 实用selenium 抓取淘宝搜索页面内的产品内容

    废话少说,上代码 #conding:utf-8 import re from selenium import webdriver from selenium.webdriver.common.by i ...

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

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

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

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

  7. 简单的抓取淘宝关键字信息、图片的Python爬虫|Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇)

    Python3中级玩家:淘宝天猫商品搜索爬虫自动化工具(第一篇) 淘宝改字段,Bugfix,查看https://github.com/hunterhug/taobaoscrapy.git 由于Gith ...

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

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

  9. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    更新 其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 可就在今天,淘宝把所有的账号设置成了匿名显示,SO,获取非匿名旺旺号已经 ...

随机推荐

  1. java最大最小堆

    堆是一种经过排序的完全二叉树,其中任一非终端节点的数据值均不大于(或不小于)其左孩子和右孩子节点的值. 最大堆和最小堆是二叉堆的两种形式. 最大堆:根结点的键值是所有堆结点键值中最大者. 最小堆:根结 ...

  2. java,eclipse中如何添加httpclient.jar

    1.Download 'Binary' package of the latest official release from the project download page. There sho ...

  3. memcached 的配置及 spymemcached 客户端简单使用

    Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.同时也可以用作不同系统之间的数据共享.应用比较广泛.下面介绍一下环境的memcached环境的搭建及简单实 ...

  4. C#或Net连接Oracle操作提示 Oracle 客户端 version 8.1.7 或更高版本报错

    异常问题 远程连接ORCALE 服务器,而本地未安装任何ORCALE 相关客户端及ODAC .using System.Data.OracleClient;当我们用程序操作Oracle库的时候,OPE ...

  5. Django基础--2

    一.路由系统 URL 1.模板语言循环字典 1.简单的字典循环 <ul> {% for i in user_dict %} <li>{{ i }}</li> {% ...

  6. 【PHP 基础类库】Prototype 原型版教学文章!

    前言 大家好我是:石不易,今天我为大家带来了PHP基础类库原型版的教学文章,至此本人的作品线已分为三大类,分别是:JavaScript前端框架(封装库).PHP模板引擎.以及PHP基础类库.该类库历时 ...

  7. Math.random()随机生成x~y间的数字

    JS如何随机产生数字呢?这就用到了Math.random()方法,它能够随机产生0~1间的数字,这个数可能为0,但会小于1. 那么,如果我想要大于等于1小于10之间的随机整数呢?需要分为以下几步: 1 ...

  8. Maven中maven-source-plugin,maven-javadoc-plugin插件的使用:

    摘要:今天领导说要把项目通过maven生产源码包和文档包并发布到自己的私服上,经过查看mavne官网发现有两个maven插件可以做到这些工作,一个是maven-source-plugin,另一个是ma ...

  9. Linux中的/etc/nologin问题

    /etc/nologin 文件给系统管理员提供了在 Linux 系统维护期间禁止用户登陆的方式. 如果系统中存在 /etc/nologin 文件那么普通用户登陆就会失败. 这是一种提高安全性和防止数据 ...

  10. 数据库MySQL基本介绍安装使用及文件导入导出

    1.数据库(data base) 1.1 简述 把文件存储在一台电脑上(服务器),其他电脑用户可以通过账号密码登陆,通过网络去访问这台电脑上的文件,但是由于每个人的数据是不同的,所以你只能通过自己的账 ...