爬虫_淘宝(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 ...
随机推荐
- H5 13-子元素选择器
13-子元素选择器 p{ color: red; } */ /* #identity>p{ color: blue; } */ div>ul>li>p{ color: purp ...
- Educational Codeforces Round 52 (Rated for Div. 2) -C
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- 最长递增子序列(lis)最长公共子序列(lcs) 最长公共上升子序列(lics)
lis: 复杂度nlgn #include<iostream> #include<cstdio> using namespace std; ],lis[],res=; int ...
- 阿里云服务器使用镜像市场上的环境以后sql不能远程问题
关于阿里云的服务器,首先要说的就是买了以后是没有环境的,什么都需要自己配置,也是在这个上面栽了很多跟头最后去的镜像市场买的一个IIS8+SQL2016的asp.net环境 怎么说呢,感觉有些问题的本源 ...
- Python_面向对象基础
概念 类 一类抽象的事物,是描述了一类事物有哪些属性或者行为,但不是具体——模子. 实例 一个依托于类的规范存在的,被赋予了具体属性值的实际存在的物体. 对象 就是实例,实例的另外一个名称,相当于别名 ...
- 现代程序设计 homework-10
经过大半学期的学习和练习, 我们把学到的东西综合起来. 通过<现代程序设计>这门课,自己的确学到了好多东西.其实并不是说讲课有多棒,一是因为讲课的次数其实并不多,二是讲课的内容其实感觉并没 ...
- Python3练习题 021:递归方法求阶乘
利用递归方法求5!. 方法一 f = 1 for i in range(1,6): f = f * i print(f) 方法二 import functools print(functo ...
- Azure系列2.1.9 —— CloudBlob
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...
- day 7-5 生产者消费者模型
一. 生产者和消费者模型 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题.该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度. 二. 为什么要使用生产者和消费者模式 ...
- 1、通过eureka创建注册中心
第一个demo(用户需要调用电影服务) 1.创建项目 new starter project 勾选上Eureka Server 2.编写application.yml #配置端口 server: po ...