16-使用Selenium模拟浏览器抓取淘宝商品美食信息
淘宝由于含有很多请求参数和加密参数,如果直接分析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模拟浏览器抓取淘宝商品美食信息的更多相关文章
- 3.使用Selenium模拟浏览器抓取淘宝商品美食信息
# 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...
- Python爬虫学习==>第十二章:使用 Selenium 模拟浏览器抓取淘宝商品美食信息
学习目的: selenium目前版本已经到了3代目,你想加薪,就跟面试官扯这个,你赢了,工资就到位了,加上一个脚本的应用,结局你懂的 正式步骤 需求背景:抓取淘宝美食 Step1:流程分析 搜索关键字 ...
- 使用Selenium模拟浏览器抓取淘宝商品美食信息
代码: import re from selenium import webdriver from selenium.webdriver.common.by import By from seleni ...
- 爬虫实战--使用Selenium模拟浏览器抓取淘宝商品美食信息
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exce ...
- 使用selenium模拟浏览器抓取淘宝信息
通过Selenium模拟浏览器抓取淘宝商品美食信息,并存储到MongoDB数据库中. from selenium import webdriver from selenium.common.excep ...
- Selenium模拟浏览器抓取淘宝美食信息
前言: 无意中在网上发现了静觅大神(崔老师),又无意中发现自己硬盘里有静觅大神录制的视频,于是乎看了其中一个,可以说是非常牛逼了,让我这个用urllib,requests用了那么久的小白,体会到sel ...
- Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息
#使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏 ...
- 关于爬虫的日常复习(10)—— 实战:使用selenium模拟浏览器爬取淘宝美食
- Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
随机推荐
- MySQL各类SQL语句的加锁机制
官网参考:https://dev.mysql.com/doc/refman/5.6/en/innodb-locks-set.html MySQL把读操作分为两大类:锁定读和非锁定读(即locking ...
- c/c++求解图的关键路径 critical path
c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程. 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以. 完成V2需要a1 ...
- 数据挖掘---Numpy的学习
什么是Numpy NumPy系统是Python的一种开源的数值计算扩展.这种工具可用来存储和处理大型矩阵(任意维度的数据处理),比Python自身的嵌套列表(nested list structure ...
- zabbix 添加自动发现端口并监控
最近在部署zabbix监控 有些服务器上开启的服务端口非常多 如果一个个添加监控会很繁琐,于是想到了自动发现规则 自动发现服务器上的服务端口并进行监控. 在zabbix客户端服务器上进行操作 1 ...
- LeetCode算法题-Majority Element(Java实现)
这是悦乐书的第181次更新,第183篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第40题(顺位题号是169).给定大小为n的数组,找到数组中出现次数超过n/2的元素.假 ...
- May 31. 2018 Week 22nd Thursday
The good seaman is known in bad weather. 惊涛骇浪,方显英雄本色. As we all know, the true worth of a person is ...
- 【微信小游戏】【提审的坑】!#¥%&……&&……%¥#@@*()()&%%¥
一.开通了虚拟支付后审核变慢 前两个版本是没有开通虚拟支付的,最快一个半小时就过审了.当时还在暗自嘲笑WX,条款很多,审核却那么松,甚至一度怀疑是不是没有审核直接放.然而第三版提审了之后,一个小时.两 ...
- cookie保存登录的用户名和密码
用cookie保存登录的用户名和密码,当用户访问网站的时候,获取cookie的用户名和密码,通过用 用cookie保存登录的用户名和密码,当用户访问网站的时候,获取cookie的用户名和密码,通过用户 ...
- Mac中selenium使用出现错误
解决方案是: 首先通过brew 安装 $ brew install geckodriver 然后设置配置文件~/.bash_profile文件 export PATH=$PATH:/path/to/g ...
- Python:Day21
序列化 我们把对象(变量)从内存中变成可存储或可传输的过程称之为序列化 json模块