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 获取本机ip地址的两个方法
Feb 25 Python
Python开发的单词频率统计工具wordsworth使用方法
Jun 25 Python
Python实现的石头剪子布代码分享
Aug 22 Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
Python生成器generator用法示例
Aug 10 Python
Python中浅拷贝copy与深拷贝deepcopy的简单理解
Oct 26 Python
Python使用matplotlib绘制三维参数曲线操作示例
Sep 10 Python
python中return的返回和执行实例
Dec 24 Python
python中线程和进程有何区别
Jun 17 Python
Flask中sqlalchemy模块的实例用法
Aug 02 Python
Python读取文件夹下的所有文件实例代码
Apr 02 Python
python中requests库+xpath+lxml简单使用
Apr 29 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
php堆排序(heapsort)练习
2013/11/13 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
php生成txt文件实例代码介绍
2016/04/28 PHP
Yii框架表单提交验证功能分析
2017/01/07 PHP
php实现留言板功能
2017/03/05 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
List Installed Software Features
2007/06/11 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
2017/01/22 Javascript
vue的Virtual Dom实现snabbdom解密
2017/05/03 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
python3基于TCP实现CS架构文件传输
2018/07/28 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
浙大网新C/C++面试解惑
2015/05/27 面试题
How to spawning asynchronous work in J2EE
2016/08/29 面试题
杠杆的科学教学反思
2014/01/10 职场文书
装修五一活动策划案
2014/01/23 职场文书
求职意向书范文
2014/04/01 职场文书
农村党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
2014年项目经理工作总结
2014/11/24 职场文书
服务员岗位职责
2015/02/03 职场文书
2016保送生自荐信范文
2016/01/29 职场文书
Python基础之元类详解
2021/04/29 Python
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript