利用Selenium爬取淘宝商品信息

by admin on 2019年11月12日

现在人们哪怕是买个牙刷可能都会在淘宝上面,而且在买东西的时候每个人都会做的一件事情就是看评论,看看之前买家评论了解商品质量,外观是不是和图片一样等等。但是如果真的想要一条一条去看的话,那时间是真的要很多,当然了如果买的小物件那倒无所谓,如果是比较贵重的物品就必须得好好看了(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)术(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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

想要爬取评论第一件事就是找到真实的URL地址,具体步骤:

2.商品分析

图片 5pic2需要说明的是src
data-src都是商品图片的网络地址,区别是前者是缩略图而后者是高清大图,两者都可以任意爬取,这里爬取的是后者图片 6pic3

这里不点击下一页,而是通过自动输入页面数来进行页面跳转,一方面是要实时监控爬取到多少页,另一方面,当程序出现异常,下一次运行又从第一页开始,下一页依次爬取,数据库中,会有重复记录

查看执行后的结果,如下图所示:

您可能感兴趣的文章:

  • Python爬虫信息输入及页面的切换方法
  • 一个简单的python爬虫程序
    爬取豆瓣热度Top100以内的电影信息
  • python爬虫爬取淘宝商品信息(selenum+phontomjs)
  • Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
  • 使用python爬虫实现网络股票信息爬取的demo
  • python爬虫_微信公众号推送信息爬取的实例
  • Python网络爬虫与信息提取(实例讲解)
  • Python爬虫实现网页信息抓取功能示例【URL与正则模块】
  • 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

通过构造查询参数,得到淘宝网的搜索URL,q后面接你要搜索的关键词。就能够跳转到搜索指定商品后的页面,也是程序的入口URL通过改变EYWORD的值,就能爬取不同商品信息;拼接URL的时候用到quote方法,屏蔽特殊字符串,如空格等,URL地址里是不含空格的,同时将字符串转换为URL编码格式,以保证URL的正确性。

下面代码等待加载时,使用了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.属性方法,获取图片URL,和其他文本信息并构造成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,模拟电脑的搜索操作,输入商品名称进行搜索,如图所示,“检查”搜索框元素。

如果你想要进行简单数据分析的话,那可以把爬取下来的评论保存下来。

图片 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

发表评论

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

网站地图xml地图