总体来说代码还不是太完美

实现了js渲染网页的解析的一种思路

主要是这个下拉操作,不能一下拉到底,数据是在中间加载进来的,

具体过程都有写注释

 from selenium import webdriver
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from lxml import etree
import re
import pymongo client = pymongo.MongoClient('127.0.0.1', port=27017)
db = client.taobao_mark
collection = db.informations def search(url): # 设置无头浏览器
opt = webdriver.ChromeOptions()
opt.set_headless()
driver = webdriver.Chrome(options=opt)
driver.get(url) # 使用显示等待加载输入文本框,设置搜索关键字,以'轻薄本'为例
input_key = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'q')))
input_key.send_keys('轻薄本') # 显示等待加载搜索按钮,然后执行点击操作
search_btn = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, 'btn-search')))
search_btn.click() # 搜索出来的网页内容只有一行与关键字相关,剩下的都是广告
# 此时发现更多相关内容在//span[@class="see-all"]这个标签的链接中,
# 通过xpath获取链接,进行跳转
element = etree.HTML(driver.page_source)
list_page_url = element.xpath('//span[@class="see-all"]/a/@href')[0]
list_page_url = 'https://s.taobao.com/' + list_page_url
driver.close()
return list_page_url def scroll(driver):
# 如果没有进行动态加载,只能获取四分之一的内容,调用js实现下拉网页进行动态加载
for y in range(7):
js='window.scrollBy(0,600)'
driver.execute_script(js)
time.sleep(0.5) def get_detail_url(url): # 用来存储列表页中商品的的链接
detail_urls = [] opt = webdriver.ChromeOptions()
opt.set_headless()
driver = webdriver.Chrome(options=opt)
# driver = webdriver.Chrome()
driver.get(url) scroll(driver) # 通过简单处理,获取当前最大页数
max_page = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//div[@class="total"]'))
)
text = max_page.get_attribute('textContent').strip()
max_page = re.findall('\d+', text, re.S)[0]
# max_page = int(max_page)
max_page = 1
# 翻页操作
for i in range(1, max_page+1):
print('正在爬取第%s页' % i)
# 使用显示等待获取页面跳转页数文本框
next_page_btn = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//input[@class="input J_Input"]'))
) # 获取确定按钮,点击后可进行翻页
submit = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.XPATH, '//span[@class="btn J_Submit"]'))
) next_page_btn.clear()
next_page_btn.send_keys(i)
# 这里直接点击会报错'提示不可点击',百度说有一个蒙层,
# 沉睡两秒等待蒙层消失即可点击
time.sleep(2)
submit.click()
scroll(driver) urls = WebDriverWait(driver, 10).until(
EC.presence_of_all_elements_located((By.XPATH, '//a[@class="img-a"]'))
)
for url in urls:
detail_urls.append(url.get_attribute('href'))
driver.close()
# 返回所有商品链接列表
return detail_urls def parse_detail(detail_urls):
parameters = []
opt = webdriver.ChromeOptions()
opt.set_headless()
driver = webdriver.Chrome(options=opt)
for url in detail_urls:
parameter = {} print('正在解析网址%s' % url)
driver.get(url)
html = driver.page_source
element = etree.HTML(html) # 名字name
name = element.xpath('//div[@class="spu-title"]/text()')
name = name[0].strip()
parameter['name'] = name # 价格price
price = element.xpath('//span[@class="price g_price g_price-highlight"]/strong/text()')[0]
price = str(price)
parameter['price'] = price # 特点specials
b = element.xpath('//div[@class="item col"]/text()')
specials = []
for i in b:
if re.match('\w', i, re.S):
specials.append(i)
parameter['specials'] = specials param = element.xpath('//span[@class="param"]/text()')
# 尺寸
size = param[0]
parameter['size'] = size
# 笔记本CPU
cpu = param[1]
parameter['cpu'] = cpu
# 显卡
graphics_card = param[2]
parameter['graphics_card'] = graphics_card
# 硬盘容量
hard_disk = param[3]
parameter['hard_disk'] = hard_disk
# 处理器主频
processor = param[4]
parameter['processor'] = processor
# 内存容量
memory = param[5]
parameter['memory'] = memory
parameter['url'] = url
print(parameter)
print('='*50)
save_to_mongo(parameter)
parameters.append(parameter)
return parameters def save_to_mongo(result):
try:
if collection.insert(result):
print('success save to mongodb', result)
except Exception:
print('error to mongo') def main():
url = 'https://www.taobao.com/'
list_page_url = search(url)
detail_urls = get_detail_url(list_page_url)
parameters = parse_detail(detail_urls) if __name__ == '__main__':
main()

运行结果

数据库

爬虫_淘宝(selenium)的更多相关文章

  1. Python爬虫 获得淘宝商品评论

    自从写了第一个sina爬虫,便一发不可收拾.进入淘宝评论爬虫正题: 在做这个的时候,也没有深思到底爬取商品评论有什么用,后来,爬下来了数据.觉得这些数据可以用于帮助分析商品的评论,从而为用户选择商品提 ...

  2. python:爬虫获取淘宝/天猫的商品信息

    [需求]输入关键字,如书包,可以搜索出对应商品的信息,包括:商品标题.商品链接.价格范围:且最终的商品信息需要符合:包邮.价格差不会超过某数值 #coding=utf-8 ""&q ...

  3. Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续一)

    通过前一节得出地址可能的构建规律,如下: https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksT ...

  4. Python 爬虫知识点 - 淘宝商品检索结果抓包分析

    一.抓包基础 在淘宝上搜索“Python机器学习”之后,试图抓取书名.作者.图片.价格.地址.出版社.书店等信息,查看源码发现html-body中没有这些信息,分析脚本发现,数据存储在了g_page_ ...

  5. 手动爬虫之淘宝笔记本栏(ptyhon3)

    1.这次爬虫用到了之前封装的Url_ProxyHelper类,源代码如下 import urllib.request as ur class Url_ProxyHelper: def __init__ ...

  6. [PHP] 编写爬虫获取淘宝网上所有的商品分类以及关键属性 销售属性 非关键属性数据

    参考文章地址:https://blog.csdn.net/zhengzizhi/article/details/80716608 http://open.taobao.com/apitools/api ...

  7. Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续二)

    一.URL分析 通过对“Python机器学习”结果抓包分析,有两个无规律的参数:_ksTS和callback.通过构建如下URL可以获得目标关键词的检索结果,如下所示: https://s.taoba ...

  8. Python post请求模拟登录淘宝并爬取商品列表

    一.前言 大概是一个月前就开始做淘宝的爬虫了,从最开始的用selenium用户配置到selenium模拟登录,再到这次的post请求模拟登录.一共是三篇博客,记录了我爬取淘宝网的经历.期间也有朋友向我 ...

  9. 学习用java基于webMagic+selenium+phantomjs实现爬虫Demo爬取淘宝搜索页面

    由于业务需要,老大要我研究一下爬虫. 团队的技术栈以java为主,并且我的主语言是Java,研究时间不到一周.基于以上原因固放弃python,选择java为语言来进行开发.等之后有时间再尝试pytho ...

随机推荐

  1. java高精度学习笔记

    高精度基本用法 valueOf(parament)     将参数转换为指定的类型 add()   相加   subtract() 相减    multiply()  相乘    divide()  ...

  2. 用python实现一个回文数

    判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向 ...

  3. Python2和Python3中urllib库中urlencode的使用注意事项

    前言 在Python中,我们通常使用urllib中的urlencode方法将字典编码,用于提交数据给url等操作,但是在Python2和Python3中urllib模块中所提供的urlencode的包 ...

  4. Git更新代码到本地

    一段时间没用git,发现一些东西记不住了,这里记一点常用的命令. 正规流程 git status(查看本地分支文件信息,确保更新时不产生冲突) 若出现冲突,会有提示的 git checkout – [ ...

  5. VMware威睿

    VMware总部位于美国加州帕洛阿尔托 [1]  ,是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案, 企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任 [2- ...

  6. Java面试题详解四:==和equals的去别

    一,功能 1.对于== 作用于基本数据类型的变量,比较的存储的值是否相等, 作用于引用类型的变量,比较的是其所指向的对象的地址是否相同(即是否是同一个对象) 2.对于equals Object的equ ...

  7. Mongo安装与使用

    MongoDB[1]  是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. mongoDB MongoDB[2]  是一个介于关系数据库和非关系数 ...

  8. Velocity ${} 和$!{}、!${}区别

    前言 在使用Velocity时经常会看到三种使用变量的情况 情况一:${name} 情况二:$!{name} 情况三:!${name} 那么三者之间到底有什么区别呢?莫慌!!!哈哈 情况一:${nam ...

  9. (三)类数组对象 NamedNodeMap简单介绍

    Ele.attrbutes将返回一个NamedNodeMap对象,即NamedNodeMap存储的是元素的“特性Attribute”集合.而集合中的每一个元素,都是Attr类型的对象. html: & ...

  10. Vue 中提示报错 handlers[i].call is not a function解决方法

    Vue 中提示警告 TypeError: handlers[i].call is not a function at callHook (vue.esm.js?a026:2921) at Object ...