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中装饰器级连的使用方法示例
Sep 29 Python
python利用OpenCV2实现人脸检测
Apr 16 Python
Python爬虫实战:分析《战狼2》豆瓣影评
Mar 26 Python
Python实现的NN神经网络算法完整示例
Jun 19 Python
python3.5基于TCP实现文件传输
Mar 20 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python识别图像并提取文字的实现方法
Jun 28 Python
pygame实现俄罗斯方块游戏(基础篇2)
Oct 29 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
Numpy 多维数据数组的实现
Jun 18 Python
python中_del_还原数据的方法
Dec 09 Python
pytorch 两个GPU同时训练的解决方案
Jun 01 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 nl2br函数 将换行字符转成 <br>
2009/08/21 PHP
php抓取页面与代码解析 推荐
2010/07/23 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
PHP代码实现爬虫记录――超管用
2015/07/31 PHP
使用Composer安装Yii框架的方法
2016/03/15 PHP
Ext grid 添加右击菜单
2009/11/26 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
jsonp原理及使用
2013/10/28 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
创建js对象和js类的方法汇总
2014/12/24 Javascript
javascript拖拽效果延伸学习
2016/04/04 Javascript
使用JavaScript获取URL中的参数(两种方法)
2016/11/16 Javascript
ReactNative短信验证码倒计时控件的实现代码
2017/07/20 Javascript
Vue组件通信实践记录(推荐)
2017/08/15 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
用javascript实现倒计时效果
2021/02/09 Javascript
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
使用 Python 实现微信公众号粉丝迁移流程
2018/01/03 Python
python hash每次调用结果不同的原因
2019/11/21 Python
python的slice notation的特殊用法详解
2019/12/27 Python
python两种注释用法的示例
2020/10/09 Python
Python通过format函数格式化显示值
2020/10/17 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
HTML5中外部浏览器唤起微信分享功能的代码
2020/09/15 HTML / CSS
学生党员的自我评价范文
2014/03/01 职场文书
珍惜时间演讲稿
2014/05/14 职场文书
班级体育活动总结
2014/07/05 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
全民创业工作总结
2015/08/13 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python
DjangoRestFramework 使用 simpleJWT 登陆认证完整记录
2021/06/22 Python
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript