利用Selenium爬取淘宝商品信息

方今大家正是是买个牙刷恐怕都会在Tmall方面,而且在买东西的时候每种人都会做的生机勃勃件业务便是看斟酌,看看早前买家商量通晓商品质量,外观是或不是和图片相似等等。不过假设实在想要一条一条去看的话,那日子是真的要比较多,当然了如若买的小物件那倒无所谓,若是是相比较崇高的物料就亟须得好雅观了(PS:在小编心里100上述便是贵重货物,哈哈哈哈卡塔尔国

前方介绍了利用selenium和chromedriver通过模拟浏览器运营的章程得以做到在浏览器中来看是什么样,抓取的源码就是什么样。不用再去管网页内部的JavaScript是如何渲染页面,也不用管网页后台的Ajax接口有如何参数,以至是加密规律等。这篇博客是实战演练,通过Selenium爬取天猫网商品的图样,名称,价格,购买人数,商铺名称,市肆所在地消息,将结果保存至Mongodb数据库中。

一. Selenium和PhantomJS介绍

正文实例为大家分享了python爬取天猫商品的切实代码,供大家参谋,具体内容如下

本人的代码

from bs4 import BeautifulSoup

path = './index.html'

with open(path, 'r') as f:
    soup = BeautifulSoup(f.read(), 'lxml')
    pics = soup.select('body > div > div > div.col-md-9 > div > div > div > img')  #图片地址
    prices = soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4.pull-right') #价格
    titles = soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4 > a')  #商品标题
    rates = soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p:nth-of-type(2)')  #评分星级
    counts = soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p.pull-right')   #评分量

    infos = []
    for pic, price, title, rate, count in zip(pics, prices, titles, rates, counts):
        info = {
            'pic': pic.get('src'),
            'price': price.get_text(),
            'title': title.get_text(),
            'rate': len(rate.find_all("span", "glyphicon glyphicon-star")),
            'count': count.get_text()
        }
        infos.append(info)
        print(info)

图片 1

上黄金年代篇博客只介绍了chromedriver在windows下的设置

Selenium是一个用来Web应用程序测量检验的工具,Selenium直接运转在浏览器中,就好像真的的客户在操作相仿。由于这一个性子,Selenium也是三个刚劲的互联网数据搜罗工具,其得以让浏览器自动加载页面,这样,使用了异步加载本领的网页,也可获得其索要的多寡。

import requests as req 
import re 

def getHTMLText(url): 
 try: 
 r = req.get(url, timeout=30) 
 r.raise_for_status() 
 r.encoding = r.apparent_encoding 
 return r.text 
 except: 
 return "" 

def parasePage(ilt, html): 
 try: 
 plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html) 
 tlt = re.findall(r'\"raw_title\"\:\".*?\"', html) 
 for i in range(len(plt)): 
  price = eval(plt[i].split(':')[1]) 
  title = eval(tlt[i].split(':')[1]) 
  ilt.append([price, title]) 
 except: 
 print("") 


def printGoodsList(ilt): 
 tplt = "{:4}\t{:8}\t{:16}" 
 print(tplt.format("序列号", "价格", "商品名称")) 
 count = 0 
 for j in ilt: 
 count = count + 1 
 print(tplt.format(count, j[0], j[1])) 

def main(): 
 goods = "python爬虫" 
 depth = 3 
 start_url = 'https://s.taobao.com/search?q=' + goods 
 infoList = [] 
 for i in range(depth): 
 try: 
  url = start_url + '&s=' + str(44*i) 
  html = getHTMLText(url) 
  parasePage(infoList, html) 
 except: 
  continue 
 printGoodsList(infoList) 

main() 

总结

  • Beautiful Soup 是一个得以从HTML或XML文件中领取数额的Python库
  • Copy selector和Copy Xpath都是描述一个因素在网页中地方的法子
  • find_all(“p”, “title”)

  # [<p class="title"><b>The Dormouse's story</b></p>] 

回来的是CSS Class为”title”的”p”标签

 

Selenium模块是Python的第三方库,能够通过pip举办安装:

效果图:

豆蔻年华经是相像人为了让投机买的事物放心当然是采纳一条一条看,只怕直接去实体门店买。可是身为技(chui卡塔 尔(英语:State of Qatar)术(niu卡塔尔人(zhuang卡塔尔员(bi卡塔尔国的小编,肯定是用Python批量爬取天猫商品音讯并张开简易的数码拆解解析啦~~~~

对应版本的下载和测量试验安装是方法是平等的

pip3 install selenium

图片 2

图片 3

//解压unzip chromedriver_linux64.zip//移动到环境变量所在的目录sudo mv chromedriver /usr/bin//或者将chromedriver所在目录,添加到环境变量export PATH="$PATH:所在目录"//执行新的配置source ~/.porfile

Selenium本人不带浏览器,必要同盟第三方浏览器来选用。通过help命令查看Selenium的Webdriver功效,查看Webdriver支持的浏览器:

更加多内容请参照他事他说加以侦查专项论题《python爬取功能汇总》张开课习。

 

1.ajax乞求解析

图片 4pic1

_ksTS,rn那五个参数很难发掘其原理,所以这里不利用构造Ajax央求的不二秘诀来爬取内容,而由此selemium价格网页最终表现效果的HTML代码全体爬取下来,再来提取所要新闻

from selenium import webdriver

help(webdriver)

上述正是本文的全体内容,希望对大家的上学抱有利于,也期望大家多都赐教脚本之家。

想要爬取批评第生龙活虎件事正是找到真正的UCR-VL地址,具体步骤:

2.货色解析

图片 5pic2供给表明的是src
data-src都是货品图片的互连网地址,区别是前者是缩略图而前面一个是高清大图,两个都能够大肆爬取,这里爬取的是继任者图片 6pic3

此地不点击下风华正茂页,而是通过活动输入页面数来扩充页面跳转,一方面是要实时监督爬取到多少页,另一面,当程序现身至极,下三次运维又从第黄金年代页伊始,下风流倜傥页依次爬取,数据库中,会有重复记录

翻开试行后的结果,如下图所示:

您大概感兴趣的稿子:

  • Python爬虫消息输入及页面的切换形式
  • 一个粗略的python爬虫程序
    爬取豆瓣热度Top100以内的电影消息
  • python爬虫爬取天猫商品音讯(selenum+phontomjs卡塔 尔(阿拉伯语:قطر‎
  • Python完毕可获得今日头条页面全部文件消息的微博互联网爬虫功用示例
  • 行使python爬虫实现互连网股票(stock卡塔 尔(英语:State of Qatar)消息爬取的demo
  • python爬虫_微信公众号推送新闻爬取的实例
  • Python互联网爬虫与音信提取(实例讲明)
  • Python爬虫实现网页新闻抓取功能示例【UENVISIONL与正则模块】
  • Python爬虫框架Scrapy实战之批量抓取招徕约请音讯
  • python定向爬虫学园论坛帖子信息
  1. F12(开采者选项卡塔 尔(阿拉伯语:قطر‎
  2. Notework
  3. F5(刷新)
  4. feedRateList(文件名)
  5. Headers
  6. 复制Request URL
1. 拿走商品列表
import pymongofrom selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitfrom urllib.parse import quotefrom pyquery import PyQuery as pqdriver = webdriver.Chrome()wait = WebDriverWait(driver,10)KEYWORD = 'iMac'def index_page: print('正在爬取第',page,'页') try: url = 'https://s.taobao.com/search?q='+quote driver.get if page > 1: input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input'))) submit = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit'))) input.clear() input.send_keys submit.click() wait.until( EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager li.item.active > span'),str wait.until( EC.presence_of_element_located(( By.CSS_SELECTOR,'.m-itemlist .items .item'))) get_products() except TimeoutException: index_page

经过组织查询参数,获得Taobao网的寻找U锐界L,q背后接您要搜索的首要词。就能够跳转到搜索内定商品后的页面,也是前后相继的入口USportageL通过改动EYWORD的值,就能够爬取不相同商品消息;拼接U中华VL的时候用到quote方法,屏蔽特殊字符串,如空格等,U途睿欧L地址里是不含空格的,同期将字符串转变为U奥迪Q7L编码格式,以管教UHighlanderL的正确性。

下边代码等待加载时,使用了WebDriverWait对象,钦点等待条件和10s的最长等待时间,就算在这里个小时内页面成分成功加载出来了,就相应结果并持续向下推行,否则抛出超时极度。EC.presence_of_element_located是因素成功加载出来,EC.presence_of_element_located
意思是因素得以点击,因为它是一个开关,那些开关的效果是选定页码后的点击鲜明后跳转。

为了申明跳转到了相应的页码,需求看清当前高亮的页码数是现阶段的页码数(当前所在页码会高亮彰显,相当于说当前页码的css是格外的),所以那边运用了另三个等候条件text_to_be_present_in_element,它会等待钦点的文件出以往某三个节点里面时即重临成功。这里大家将高亮的页码节点对应的CSS选取器和如今要跳转的页码通过参数字传送递给这些等待条件,那样它就能够检查实验当前高亮的页码节点是否大家传过来的页码数,要是是,就表达页面成功跳转到了那豆蔻年华页,页面跳转成功。

如此刚才达成的index_page()方法就足以流传对应的页码,待加载出相应页码的货品列表后,再去调用get_products()方法举行页面剖析。

那个等待条件的参数都以一定的css选取器,不做赘述了,图片已经标记的很领悟了

图片 7

然后去除无需的字段,获取本身想要的内容

2.深入分析货色列表
def get_products(): html = driver.page_source doc = pq items = doc('#mainsrp-itemlist .items .item').items() for item in items: product = { 'image' : item.find('.pic .img').attr('data-src'), 'price' : item.find.text(), 'deal' : item.find('.deal-cnt').text(), 'title' : item.find.text(), 'shop': item.find.text(), 'location':item.find('.location').text() } print save_to_mongo print

通过driver.page_source
拿到了区别页码下后生可畏体化html源码;相同的时候使用Pyqurey来解析网页,通过已经查找的竹签,查找这一个标签下的子标签或许父标签,而毫不从头初叶查找,效能更加高;通过find.属性办法,获取图片U昂科雷L,和其余文件信息并构形成Json字符串,调用save_to_mongo函数存入数据库中。

在这里个案例中,选拔PhantomJS。Selenium和PhantomJS的合营使用能够完全模仿客商在浏览器上的富有操作,包含输入框内容填写、单击、截屏、下滑等各个操作。这样,对于急需登入的网址,客商可以不要求通过协会表单或提交cookie信息来报到网址。

图片 8

3.将结果保存到Mogodb中
def save_to_mongo: client = pymongo.MongoClient('mongodb://admin:admin123@localhost:27017/') db = client['taobao'] collection = db['products'] try: if collection.insert: print("成功保存到MongoDB") except Exception: print('someing wrong with MongDB')

python3由此认证方法连接Mongodb数据库,admin是自己的顾客名,admin123是本身的密码,接着钦命数据库和集中,调用insert格局插入数据。

二. 案例介绍

 

4.概念爬取页数
def main(): MAX_PAGE = 100 for i in range(1,MAX_PAGE+1): index_page driver.close()if __name__ =='__main__': main()

差超少for循环,并经过range生成1到100的数字传送递给index_page函数。

此间所举的案例,是应用Selenium爬取天猫商品新闻,爬取的剧情为天猫网(

寻访运维后的坚决守护图

5.完璧归赵代码
import pymongofrom selenium import webdriverfrom selenium.common.exceptions import TimeoutExceptionfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.wait import WebDriverWaitfrom urllib.parse import quotefrom pyquery import PyQuery as pqdriver = webdriver.Chrome()wait = WebDriverWait(driver,10)KEYWORD = 'iMac'def index_page: print('正在爬取第',page,'页') try: url = 'https://s.taobao.com/search?q='+quote driver.get if page > 1: input = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager div.form > input'))) submit = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager div.form > span.btn.J_Submit'))) input.clear() input.send_keys submit.click() wait.until( EC.text_to_be_present_in_element((By.CSS_SELECTOR,'#mainsrp-pager li.item.active > span'),str wait.until( EC.presence_of_element_located(( By.CSS_SELECTOR,'.m-itemlist .items .item'))) get_products() except TimeoutException: index_pagedef get_products(): html = driver.page_source doc = pq items = doc('#mainsrp-itemlist .items .item').items() for item in items: product = { 'image' : item.find('.pic .img').attr('data-src'), 'price' : item.find.text(), 'deal' : item.find('.deal-cnt').text(), 'title' : item.find.text(), 'shop': item.find.text(), 'location':item.find('.location').text() } print save_to_mongo printdef save_to_mongo: client = pymongo.MongoClient('mongodb://admin:admin123@localhost:27017/') db = client['taobao'] collection = db['products'] try: if collection.insert: print("成功保存到MongoDB") except Exception: print('someing wrong with MongDB') MAX_PAGE = 100def main(): for i in range(1,MAX_PAGE+1): index_page driver.close()if __name__ =='__main__': main() 

这段程序是对原先所学知识的综合选择,Mongodb是前几日现学现用,那是本身先是次利用,关系型数据库Oracle,Sql
server,Mysql
都用过,基本知识也许有调整,非关系型数据库Mongodb未来恐怕会写几篇学习笔记

图片 9

图片 10

1,输出结果

图片 11pic4

那边可以看见,在顾客输入天猫商城后,需求效法输入,在输入框输入“男子短袖”。

 

2.查看mongodb中存入的数目

图片 12pic5

案例中行使Selenium和PhantomJS,模拟Computer的搜寻操作,输入商品名称举行寻觅,如图所示,“检查”找寻框成分。

借让你想要进行简要多少分析的话,那能够把爬取下来的评说保存下来。

图片 13

下一场用Python对其张开多少剖析,对于数据可视化作者比较推荐pyecharts

再正是如下图所示,“检查”下后生可畏页成分:

它可以是如此的

图片 14

图片 15

爬取的剧情有商品价位、付款人数、商品名称、商家名称和地址,如下图所示:

 

图片 16

也足以是如此的

最后把爬取数据存款和储蓄到MongoDB数据库中。

图片 17

三. 相关才能

此间把除了selenium之外所需求的知识列一下,这里就不做详细分解了,如果不通晓的话能够百度问询下。

  • mongoDB的施用,以致在python中用mongodb进行数量存款和储蓄。

  • lxml,爬虫三大方法之豆蔻梢头,解析功效比较高,使用难度相比较正则表明式要低(上生龙活虎篇小说的拆解深入分析方法是正则表明式卡塔尔。

  • 暂停休息的艺术:driver.implicitly_wait

四. 源代码

代码如下所示,可复制直接实施:

from selenium import webdriverfrom lxml import etreeimport timeimport pymongoclient = pymongo.MongoClient('localhost',  27017)mydb = client['mydb']taobao = mydb['taobao']driver = webdriver.PhantomJS()driver.maximize_window() def get_info:     page = page + 1     driver.get     driver.implicitly_wait(10)     selector = etree.HTML(driver.page_source)     infos = selector.xpath('//div[@]')     for info in infos:        data = info.xpath('div/div/a')[0]        goods =  data.xpath('string').strip()        price = info.xpath('div/div/div/strong/text()')[0]        sell =  info.xpath('div/div/div[@]/text()')[0]        shop =  info.xpath('div[2]/div[3]/div[1]/a/span[2]/text()')[0]        address =  info.xpath('div[2]/div[3]/div[2]/text()')[0]        commodity = {            'good':goods,            'price':price,            'sell':sell,            'shop':shop,            'address':address        }        taobao.insert_one(commodity)     if page <= 50:        NextPage     else:        passdef NextPage:     driver.get     driver.implicitly_wait(10)         driver.find_element_by_xpath('//a[@trace="srp_bottom_pagedown"]').click()     time.sleep(4)     driver.get(driver.current_url)     driver.implicitly_wait(10)     get_info(driver.current_url,page)if __name__ == '__main__':     page = 1     url = 'https://www.taobao.com/'     driver.get     driver.implicitly_wait(10)     driver.find_element_by_id('q').clear()     driver.find_element_by_id('q').send_keys('男士短袖')     driver.find_element_by_class_name('btn-search').click()     get_info(driver.current_url,page)

五. 代码剖判

1~4行

导入程序须求的库,selenium库用于模拟乞求和相互影响。lxml解析数据。pymongo是mongoDB
的人机联作库。

6~8行

打开mongoDB,举办仓库储存计划。

10~11行

最大化PhantomJS窗口。

14~33行

采纳lxml抓取网页数据,分别定位到所急需的音信,并把音讯集成至json,存款和储蓄至mongoDB。

35~47行

分页管理。

51~57行

利用selenium模拟输入“男子短袖”,并模仿点击操作,并取获得对应的页面消息,调取主方法解析。

———————————————————

公众号-智能化IT系统。周周都有本事小说推送,包涵原创本领干货,以致才能工作的体会分享。扫描下方关切。

图片 18

发表评论

电子邮件地址不会被公开。 必填项已用*标注