淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击、输入、下拉等,这样我们只需要关心操作而不需要关心后台发生了怎样的请求。PhantomJS是一个无界面的浏览器。

爬取淘宝搜索关键词下的宝贝内容,爬取到MONGODB,使用的解析库是pyquery。

步骤:

搜索关键字:利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。

分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表。

分析提取商品内容:利用PyQuery分析源码,解析得到商品列表。

存储到MongoDB:将商品列表信息存储到数据库MongoDB。

spider.py

'''selenium库的API:https://selenium-python.readthedocs.io/。需要实现的功能可以参考API实现。'''
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import re
from pyquery import PyQuery
#导入存储MONGODB数据库的配置信息
from config import *
import pymongo
#定义一个mongodb客户端
client = pymongo.MongoClient(MONGO_URL)
#定义数据库
db = client[MONGO_DB] # browser = webdriver.Chrome(executable_path="D:\ASoft\Python\chromedriver\chromedriver.exe")
#我们在通过Selenium运行自动化测试时,必须要启动浏览器,浏览器的启动与关闭必然会影响执行效率。
#Chrome-headless 模式,Google 自己出的无头浏览器模式。
#由于PhantomJS已经被新版本的selenium库弃用,所以使用Chrome-headless。
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(executable_path='D:\ASoft\Python\chromedriver\chromedriver.exe', chrome_options=chrome_options) wait = WebDriverWait(browser, 1000)
def search():
try:
'''第一步:搜索关键字:利用Selenium驱动浏览器搜索关键字,得到查询后的商品列表。'''
browser.get('https://www.taobao.com')
#等待查询输入框加载出来
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
)
#等待按钮可点击
submit = wait.until(
#EC是选择条件,这里按钮选择条件设置为可点击
# 选中‘搜索’按钮的源码右键copy->copy seletor,得到‘搜索'按钮的CSS_SELECTOR。
EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')) #此处用的火狐浏览器的,谷歌浏览器得到的CSS_SELECTOR不好使。
)
#参考API的send_keys方法发送关键词
input.send_keys(KEYWORD)
submit.click()
'''第二步:分析页码并翻页:得到商品页码数,模拟翻页,得到后续页面的商品列表。'''
#获取总的页码数
total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
#在页面加载出来之后调用get_products()获取商品详情信息
get_products()
return total.text
except TimeoutError:
return search() #实现翻页
def next_page(page_number):
try:
#得到到第几页的输入框
input = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.form > input')))
#得到到第几页的确定按钮
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()
#等待高亮的页码显示为page_number
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()获取商品详情信息
get_products()
except TimeoutError:
next_page(page_number) #得到每个商品的详细信息
def get_products():
'''第三步:分析提取商品内容:利用PyQuery分析源码,解析得到商品列表。'''
#得到每个商品item
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-itemlist .items .item')))
#得到网页的源代码
html = browser.page_source
#用PyQuery库解析网页源代码
doc = PyQuery(html)
#得到所有选择的内容
items = doc('#mainsrp-itemlist .items .item').items()
#遍历每个item,得到其中的信息
for item in items:
product = {
#得到图片信息,得到它的src属性。源码中可能出现多类选择器http://www.w3school.com.cn/css/css_selector_class.asp,可以只选择一个类选择器。
'image':item.find('.pic .img').attr('src'),
'price':item.find('.price').text(),
'deal':item.find('.deal-cnt').text()[:-3],
'title':item.find('.title').text(),
'shop':item.find('.shop').text(),
'location':item.find('.location').text()
}
print(product)
#存储到MONGODB
save_to_mongo(product) def save_to_mongo(result):
'''第四部:存储到MongoDB:将商品列表信息存储到数据库MongoDB。'''
try:
if db[MONGO_TABLE].insert(result):
print('存储到MONGODB成功',result)
except Exception:
print('存储到MONGODB失败',result) def main():
try:
total = search()
total = int(re.compile('(\d+)').search(total).group(1))
for i in range(2,total + 1):
next_page(i)
except Exception:
print('出错了')
finally:
#关闭浏览器
browser.close() if __name__ == '__main__':
main() config.py
MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_TABLE = 'product' KEYWORD = '美食'

16-使用Selenium模拟浏览器抓取淘宝商品美食信息的更多相关文章

  1. 3.使用Selenium模拟浏览器抓取淘宝商品美食信息

    # 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...

  2. Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息

    学习目的: selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的 正式步骤 需求背景:抓取淘宝美食 Step1:流程分析 搜索关键字 ...

  3. 使用Selenium模拟浏览器抓取淘宝商品美食信息

    代码: import re from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...

  4. 爬虫实战--使用Selenium模拟浏览器抓取淘宝商品美食信息

    from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exce ...

  5. 使用selenium模拟浏览器抓取淘宝信息

    通过Selenium模拟浏览器抓取淘宝商品美食信息,并存储到MongoDB数据库中. from selenium import webdriver from selenium.common.excep ...

  6. Selenium模拟浏览器抓取淘宝美食信息

    前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...

  7. Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息

    #使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏 ...

  8. 关于爬虫的日常复习(10)—— 实战:使用selenium模拟浏览器爬取淘宝美食

  9. Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取

    区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...

随机推荐

  1. ASP.NET MVC 扩展方法

    一.扩展方法的语法        在视图中使用扩展方法的时候 如果扩展方法定义的类在其他命名空间,需要首先引用该命名空间,才能使用该扩展方法        static class 静态类名      ...

  2. Linux进程优先级的处理--Linux进程的管理与调度(二十二)

    1. linux优先级的表示 1.1 优先级的内核表示 linux优先级概述 在用户空间通过nice命令设置进程的静态优先级, 这在内部会调用nice系统调用, 进程的nice值在-20~+19之间. ...

  3. vscode中配置php的xdebug

    vscode中配置php的xdebug vscode配置php的xdebug,步骤如下: 1. 安装phpdebug插件: PHP Debug 2.网上下载php的xdebug扩展(注意根据自己的ph ...

  4. Spring的jdbc模板1

    Spring是EE开发的一站式框架,有EE开发的每一层解决方案.Spring对持久层也提供了解决方案:ORM模块和jdbc模块,ORM模块在整合其他框架的时候使用 Spring提供了很多的模板用于简化 ...

  5. NGINX Load Balancing – TCP and UDP Load Balancer

    This chapter describes how to use NGINX Plus and open source NGINX to proxy and load balance TCP and ...

  6. ContentTypes 的应用

    ContentTypes django 中的一个应用程序(app),可以跟踪Django项目中安装的所有模型(Model),提供用于处理模型的高级通用接口. Contenttypes应用的核心是Con ...

  7. SQLite 知识摘要 --- 线程模式、事务模式

    本篇主要从SQLite事务执行的原理中寻找如何更高效地使用它. 本篇预备知识 我们先来了解下SQLite执行事务的基本流程,状态变化过程,再分析怎么使用才更优.SQLite定义的锁的状态有如下几种: ...

  8. UVA1471-Defense Lines(思维+STL)

    Problem UVA1471-Defense Lines Accept: 297  Submit: 2776Time Limit: 9000 mSec Problem Description Aft ...

  9. Quartz动态添加定时任务执行sql(服务启动添加+手动添加)

    系统用来每天插入视图数据... 一.数据库表设计 1.接口配置表(t_m_db_interface_config) 2.接口日志表(t_m_db_interface_log) 3.前端配置页面 查询页 ...

  10. 【转】idea 2018注册码(激活码)永久性的

    百度的,上一个没用多久就挂了,这次用http://idea.toocruel.net 激活方式:License Server1.将地址 http://active.chinapyg.com/ 或者 h ...