python按综合、销量排序抓取100页的淘宝商品列表信息


Posted in Python onFebruary 24, 2018

进入淘宝网,分别按综合、销量排序抓取100页的所有商品的列表信息。

1、按综合

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 * #可引用congif的所有变量 
import pymongo 
import pymysql 
 
# client=pymongo.MongoClient(MONGO_URL) 
# db = client[MONGO_DB] 
 
# 按综合排序 100页 
 
 
# 打开淘宝链接,输入‘美食',搜索 
# 自动翻页:先得到总页数,再转到 _ 页,确定 
# 
 
# browser = webdriver.PhantomJS(service_args=SERVICE_ARGS) 
# browser =webdriver.Chrome() 
browser = webdriver.Firefox() 
wait = WebDriverWait(browser,10) 
 
def search(): 
 print('正在搜索...') 
 try: 
  browser.get('https://www.taobao.com') #用这个网页'https://s.taobao.com',无法输入keywords 
  input=wait.until( 
    EC.presence_of_element_located((By.CSS_SELECTOR,'#q')) #打开淘宝,右击查看元素,定位到搜索框,选择对应代码,复制-CSS选择器,其实就是‘#q'。 
  ) 
  submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button'))) 
  input.send_keys(KEYWORD) #模拟操作,输入内容 
  submit.click() #点击提交 
  total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total'))) #页数 
  return total.text 
 except TimeoutException : 
  return search() 
 
# 翻页 
def next_page(page_number): 
 print('正在翻页',page_number) 
 try: 
  input = wait.until( 
   # 输入框 
   EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')) # 打开淘宝,右击查看元素,定位到搜索框,选择对应代码,复制-CSS选择器,其实就是‘#q'。 
  ) 
  # 搜索按钮 
  submit = 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) # 模拟操作,输入页码 
  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() 
 except TimeoutException : 
  next_page(page_number) 
 
# 解析,获取每页的商品并输出 
def get_products(): 
 wait.until(EC.presence_of_all_elements_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 = { 
   # 'picture':item.find('.pic .img').attr('src'),#用find去获取内部元素,选择器是 pic,img,用attr获取属性 
   'image': item.find('.pic .img').attr('data-src'), # 用find去获取内部元素,选择器是 pic,img,用attr获取属性 
   'shop_id': item.find('.shop').find('a').attr('data-userid'), # 店铺 id 
   'data_id': item.find('.shop').find('a').attr('data-nid'), # 商品 id 
   'link': item.find('.pic-box-inner').find('.pic').find('a').attr['href'], 
   'price':item.find('.price').text()[1:-3], # 用text获取内容 
   'deal':item.find('.deal-cnt').text()[:-3], 
   'title':item.find('.title').text().replace(' ',''), 
   'shop':item.find('.shop').text(), 
   'location':item.find('.location').text() 
  } 
  # print(product) 
  # print(product['location']) 
  save_to_mysql(product) 
''''' 
def main(): 
 try: 
  # search() 
  total=search() # 此时 total = ‘共 100 页,' 
  total=int(re.compile('(\d+)').search(total).group(1)) # 用正则表达式提取数字100 
  # print(total) 
  for i in range(2,total+1): 
   next_page(i) 
 except Exception: 
  print('出错啦') 
 finally: # 不管有没有异常,都要执行此操作 
  browser.close() # 关浏览器 
''' 
 
def main(): 
 total=search() 
 total=int(re.compile('(\d+)').search(total).group(1)) 
 for i in range(2,total+1): 
  next_page(i)#显示当前爬取网页的页数 
  print ('搞定%d'%i) 
 
def save_to_mysql(product): 
 # print(product['location']) 
 #,use_unicode = False 
 try: 
  conn = pymysql.connect(host='localhost', user='root', passwd=' ', db='test1', port=3306,charset='utf8' ) 
  cur = conn.cursor() # 创建一个游标对象 
  sql = """INSERT INTO women_clothes_zonghe VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)""" 
  cur.execute(sql, (product['shop_id'],product['shop'], product['link'],product['data_id'], product['title'], product['price'], product['location'],product['deal'],product['image'])) 
  # cur.execute(sql) 
  print('- - - - - 数据保存成功 - - - - -') 
  cur.close() 
  conn.commit() 
  conn.close() # 关闭数据 
 except pymysql.Error as e: 
  print(e) 
 
if __name__=='__main__': 
 # 连接数据库 
 conn = pymysql.connect(host='localhost', user='root', passwd=' ', db='test1', port=3306,charset="utf8") 
 cur = conn.cursor() # 创建一个游标对象 
 cur.execute("DROP TABLE IF EXISTS women_clothes_zonghe") # 如果表存在则删除 
 # 创建表sql语句 
 sqlc = """CREATE TABLE women_clothes_zonghe( 
  shop_id VARCHAR(500), 
  shop VARCHAR(500), 
  link VARCHAR(1000), 
  data_id varchar(100), 
  title VARCHAR(1000), 
  price VARCHAR(500), 
  location VARCHAR(500), 
  deal VARCHAR(500), 
  image VARCHAR(1000) 
 )""" 
 cur.execute(sqlc) # 执行创建数据表操作 
 main()

2、按销量

import re 
 
from bs4 import BeautifulSoup 
from pyquery import PyQuery as pq #获取整个网页的源代码 
 
from config import * #可引用congif的所有变量 
import pymongo 
import pymysql 
 
import urllib 
import requests 
import json 
import bs4 
 
from selenium import webdriver 
from pyquery import PyQuery as pq #获取整个网页的源代码 
 
# 完整爬取所有页面的商品信息 共100页 按销量排序 
 
 
browser = webdriver.Firefox() 
wait = WebDriverWait(browser,10) 
 
def get_url(keyword): 
 url_str = urllib.parse.quote(keyword) 
 i = 0 
 for j in range(100): 
  yield{ 
   'url':('https://s.taobao.com/search?q={}&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=' 
   'a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20170808&sort=sale-desc&bcoffset=0&p4ppushleft=%2C44&s={}').format(url_str,i) 
  } 
  i+=44 
 
# 可行 
def get_products(url): 
 browser.get(url) 
 wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item'))) #加载所有宝贝 
 html=browser.page_source 
 doc = pq(html) 
 # print(doc) 
 items = doc('#mainsrp-itemlist .items .item').items() 
 for item in items: 
  product = { 
   # 获取 image 时,用'src'总有部分图片获取不到,因为淘宝设有'data-src' 和'src',不同商品这两个属性的前后顺序不一样,直接用'data-src'可避免返回 None 
   'image':item.find('.pic .img').attr('data-src'),#用find去获取内部元素,选择器是 pic,img,用attr获取属性 
   # 'image':item.find('.pic-box-inner').find('.pic').find('img').attr['src'], 
   'price':item.find('.price').text()[1:-3], # 用text获取内容 
   'shop_id': item.find('.shop').find('a').attr('data-userid'), # 店铺 id 
   'data_id': item.find('.shop').find('a').attr('data-nid'), # 商品 id 
   'link': item.find('.pic-box-inner').find('.pic').find('a').attr['href'], 
   'deal':item.find('.deal-cnt').text()[:-3], 
   'title':item.find('.title').text(), 
   'shop':item.find('.shop').text(), 
   'location':item.find('.location').text().replace(' ','') 
  } 
  # print(product) 
  save_to_mysql(product) 
 
def save_to_mysql(product): 
 try: 
  conn = pymysql.connect(host='localhost',user='root',passwd=' ',port=3306,db='test1',charset='utf8') 
  cur = conn.cursor() 
  sql = "insert into women_clothes_sales2 values (%s,%s,%s,%s,%s,%s,%s,%s,%s)" 
  cur.execute(sql,(product['shop_id'],product['shop'],product['link'],product['data_id'],product['title'],product['price'],product['location'],product['deal'],product['image'])) 
  print('- - - 数据保存成功 - - - ') 
  cur.close() 
  conn.commit() 
  conn.close() 
 except pymysql.Error as e: 
  print(e) 
 
def main(): 
 keyword = '女装' 
 links = get_url(keyword) # 字典 
 # 获取每页的 url 
 for link in links: 
  # print(link) 
  url = link['url'] 
  #解析页面 
  # soup = get_html(url) 
  # print(soup) 
  # get_detail(soup,url) 
  get_products(url) 
 
if __name__=='__main__': 
 conn = pymysql.connect(host='localhost',user = 'root',passwd=' ',db='test1',port = 3306,charset='utf8') 
 cur = conn.cursor() 
 cur.execute('Drop table if exists women_clothes_sales2') 
 sqlc = "create table women_clothes_sales2(shop_id varchar(100),shop varchar(500),link varchar(1000),data_id varchar(100),title varchar(500),price varchar(200),location varchar(100),deal varchar(100),image varchar(1000))" 
 cur.execute(sqlc) 
 cur.close() 
 conn.commit() 
 conn.close() 
 main()

更多内容请参考专题《python爬取功能汇总》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
python如何生成网页验证码
Jul 28 Python
详解windows python3.7安装numpy问题的解决方法
Aug 13 Python
Python Learning 列表的更多操作及示例代码
Aug 22 Python
详解python执行shell脚本创建用户及相关操作
Apr 11 Python
python中pygame安装过程(超级详细)
Aug 04 Python
Python中zip()函数的简单用法举例
Sep 02 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
python,Java,JavaScript实现indexOf
Sep 09 Python
pytorch损失反向传播后梯度为none的问题
May 12 Python
Python基础之元编程知识总结
May 23 Python
Python中itertools库的四个函数介绍
Apr 06 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 #Python
Python 中Pickle库的使用详解
Feb 24 #Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
Feb 24 #Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 #Python
Python3实现带附件的定时发送邮件功能
Dec 22 #Python
python正则实现提取电话功能
Feb 24 #Python
python3实现公众号每日定时发送日报和图片
Feb 24 #Python
You might like
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
PHP面向对象自动加载机制原理与用法分析
2016/10/14 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
2019/02/20 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
表单元素的submit()方法和onsubmit事件应用概述
2013/02/01 Javascript
jQuery照片伸缩效果不影响其他元素的布局
2014/05/09 Javascript
JQuery基础语法小结
2015/02/27 Javascript
JS选中checkbox后获取table内一行TD所有数据的方法
2015/07/01 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
Vue中图片Src使用变量的方法
2019/10/30 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[43:57]LGD vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python中常见的数据类型小结
2015/08/29 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
Python Dataframe 指定多列去重、求差集的方法
2018/07/10 Python
mac下如何将python2.7改为python3
2018/07/13 Python
对python GUI实现完美进度条的示例详解
2018/12/13 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
CSS改变网页中鼠标选中文字背景颜色例子
2014/04/23 HTML / CSS
CSS3实现同时执行倾斜和旋转的动画效果
2016/10/27 HTML / CSS
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
中学生获奖感言
2014/02/04 职场文书
六查六看自检自查剖析材料
2014/10/14 职场文书
紧急迫降观后感
2015/06/15 职场文书
2016年“六一儿童节”校园广播稿
2015/12/17 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis