爬虫_淘宝(selenium)
总体来说代码还不是太完美
实现了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)的更多相关文章
- Python爬虫 获得淘宝商品评论
自从写了第一个sina爬虫,便一发不可收拾.进入淘宝评论爬虫正题: 在做这个的时候,也没有深思到底爬取商品评论有什么用,后来,爬下来了数据.觉得这些数据可以用于帮助分析商品的评论,从而为用户选择商品提 ...
- python:爬虫获取淘宝/天猫的商品信息
[需求]输入关键字,如书包,可以搜索出对应商品的信息,包括:商品标题.商品链接.价格范围:且最终的商品信息需要符合:包邮.价格差不会超过某数值 #coding=utf-8 ""&q ...
- Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续一)
通过前一节得出地址可能的构建规律,如下: https://s.taobao.com/search?data-key=s&data-value=44&ajax=true&_ksT ...
- Python 爬虫知识点 - 淘宝商品检索结果抓包分析
一.抓包基础 在淘宝上搜索“Python机器学习”之后,试图抓取书名.作者.图片.价格.地址.出版社.书店等信息,查看源码发现html-body中没有这些信息,分析脚本发现,数据存储在了g_page_ ...
- 手动爬虫之淘宝笔记本栏(ptyhon3)
1.这次爬虫用到了之前封装的Url_ProxyHelper类,源代码如下 import urllib.request as ur class Url_ProxyHelper: def __init__ ...
- [PHP] 编写爬虫获取淘宝网上所有的商品分类以及关键属性 销售属性 非关键属性数据
参考文章地址:https://blog.csdn.net/zhengzizhi/article/details/80716608 http://open.taobao.com/apitools/api ...
- Python 爬虫知识点 - 淘宝商品检索结果抓包分析(续二)
一.URL分析 通过对“Python机器学习”结果抓包分析,有两个无规律的参数:_ksTS和callback.通过构建如下URL可以获得目标关键词的检索结果,如下所示: https://s.taoba ...
- Python post请求模拟登录淘宝并爬取商品列表
一.前言 大概是一个月前就开始做淘宝的爬虫了,从最开始的用selenium用户配置到selenium模拟登录,再到这次的post请求模拟登录.一共是三篇博客,记录了我爬取淘宝网的经历.期间也有朋友向我 ...
- 学习用java基于webMagic+selenium+phantomjs实现爬虫Demo爬取淘宝搜索页面
由于业务需要,老大要我研究一下爬虫. 团队的技术栈以java为主,并且我的主语言是Java,研究时间不到一周.基于以上原因固放弃python,选择java为语言来进行开发.等之后有时间再尝试pytho ...
随机推荐
- Python—函数的名称空间
名称空间 又名name space, 顾名思义就是存放名字的地方,存什么名字呢?举例说明,若变量x=1,1存放于内存中,那名字x存放在哪里呢?名称空间正是存放名字x与1绑定关系的地方 名称空间共3种, ...
- pip 安装 和 卸载 django
1. 在dos命令行中输入 pip 如下命令进行安装: 安装最新的版本的 Django 命令如下: pip install django 安装 指定版本的 Django 命令如下: pip insta ...
- Django之在Python中调用Django环境
Django之在Python中调用Django环境 新建一个py文件,在其中写下如下代码: import os if __name__ == '__main__': os.environ.setdef ...
- 最全的Django入门及常用配置
Django 常用配置 Django 安装 pipx install django x 为python解释器版本2 or 3 如果你想安装指定版本的django,使用pip install djang ...
- K8S、云计算、大数据、编程语言
云计算.大数据.编程语言学习指南下载,100+技术课程免费学!这份诚意满满的新年技术大礼包,你Get了吗?-云栖社区-阿里云https://yq.aliyun.com/articles/691028 ...
- 阿里云CodePipeline vs Jenkins
产品概述_产品简介_CodePipeline-阿里云 https://help.aliyun.com/document_detail/56512.html CodePipeline管理控制台https ...
- Python3练习题 021:递归方法求阶乘
利用递归方法求5!. 方法一 f = 1 for i in range(1,6): f = f * i print(f) 方法二 import functools print(functo ...
- spring bean之间的关系:继承,依赖,注入
一 继承 spring中多个bean之间的继承关系,和面向对象中的继承关系类似,直接看代码. 先定义一个Person类 package com.demo.spring.entity; /** * @a ...
- Linux 的相关操作
切换权限 在linux环境下,用户之前的切换使用 “su - name,若要切换到root下面,则使用sudo su 命令即可. 在linux下安装软件,经常就是装完后不知道装到哪里去了 (201 ...
- Python模拟wc命令(软件测试第二次作业)
Python实现字符,单词,行,代码行,空行及可视化 Gitee项目地址:https://gitee.com/biubiubiuLYQ/word_and_character_statistics 一. ...