最近项目有些需求,抓取淘宝的搜索商品,抓取的品类还多。直接用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. jQ中css()和addClass的区别之优先级

    笔者在实现点击表格中某行添加高亮的效果时,发现一个css()和addClassd()的冲突,具体代码如下: <style> .se { background:#FF6500; color: ...

  2. $.ajax显示进度条

  3. 编译Win32动态库工程的两个链接错误的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天编译一个Win32动态库工程,出现两个链接错误的解决,一个是: main.obj: error LNK2001: ...

  4. Struts2_用ModelDriven接收参数

    通过实现 ModelDriven 接口来接收请求参数,这种方法用的比较少,一般还是用前两种. 请求: <a href="user/user!add?name=xiaoer&ag ...

  5. Sigrity PowerDC是如何计算IR Drop Margin?

    IR Drop仿真是一个系统层面的问题,需要考虑完整的Power Distribution System(PDS)链路上所有压降,并以此来优化每颗器件所接收到的供电电压. 在设计设计中所有的电源供电芯 ...

  6. 对json数据进行排序

    项目有这样一个需要对数据库取出的数据按sort字段进行显示:这个时候想起来在JS中对json数据进行一个排序再进行数据填充可以实现此效果 var colId = "sort";// ...

  7. Microsoft EDP(enterprise database protection)配置策略中的三种Rule template

    搭建Microsoft EDP环境: Microsoft 10 insider preview,Microsoft Intune,ie10(要安装插件silverlight) 这里暂时只说在进行配置策 ...

  8. js 流程控制语句

    1.复合语句 2.switch语句 3.do...while语句 4.while语句 5.for语句 6.for...in语句 7.break和continue语句 9.with语句 10.if语句 ...

  9. 从windows CMD 命令行(CMD promp)运行Docker

    英文原帖 Running Docker from Windows CMD prompt https://medium.com/@neil.avery_68603/running-docker-from ...

  10. MySQL入门很简单: 3 操作数据库

    登陆:mysq -u root -p 0409 1). 创建, 删除数据库 SHOW DATABASES; 显示已经存在的数据率 CREATE DATABASES 数据库名: 创建数据库 DROP D ...