Python爬虫-Selenium爬取淘宝美食

为什么要使用Selenium呢?
Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。随后我们就可以获取测试的网页相关信息。
该项目主页
http://www.openqa.org/selenium/

python -m pip install selenium安装即可,
然后安装chromedriver.exe
然后将chromedriver.exe放置在谷歌浏览器的目录下,将目录加到环境变量。

一般来说chromedriver.exe的路径是下面这个

path = 'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'

Selenium使用流程

  1. 启动一个Selenium
  2. 搜索关键字
  3. 分析网页并翻页
  4. 分析提取商品信息
启动一个Selenium

首先还是先看文档,怎么启动一个Selenium。
官方文档http://selenium-python.readthedocs.io/waits.html
由于我们请求网页肯定是要等待网页完全加载ok才能进行下一步,我们查看一下5.wait这一部分。
这里写图片描述
这个示例我们就可以直接拿来使用。
由于笔者使用的Chrome浏览器,所以需要修改:

driver = webdriver.Chrome()

我们修改url试着请求淘宝首页试试。

driver.get("https://www.taobao.com/")

运行即可进入淘宝首页。

搜索关键字

接下来我们在输入框中输入美食:
这里写图片描述
查看文档怎么输入内容。
我们可以根据输入框的CSS属性、ID或者XPATH等 获取到这个输入框,然后让他输入“美食”,然后点击搜索。
这里写图片描述
上面是描述以及,按钮点击的小例子。

我们下面来实现它。
这里写图片描述
右键选择这个标签可以直接获取属性。例如CSS和XPATH或者查看ID。

browsr = webdriver.Chrome()
wait = WebDriverWait(browsr, 10)

def search():
    # 请求首页
    browsr.get('https://www.taobao.com')
    # 判断加载是否成功
    # http://selenium-python.readthedocs.io/waits.html
    try:
        #延时相关操作
        input = wait.until(
            # 注意使用CSS选择器
            EC.presence_of_element_located((By.CSS_SELECTOR, "#q")) 
        )
        #查看官方文档
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button")) 
        #输入框输入 美食
        input.send_keys('美食')
        #点击确认按钮
        submit.click()

    finally:
        browsr.quit()

if __name__ == '__main__':
    search()

运行发现自动开启浏览器,进入淘宝首页,输入美食,点击搜索。

分析网页并翻页

有个提问,假如网速比较慢,请求容易超时,我们可以选择再次请求。

    #接上部分代码
    except TimeoutException:
        return search() #重新请求

首先获取总页数
这里写图片描述

#这个标签长这样  我们需要获取数字即可
<div class="total">
        共 100 页,
      </div>
totle = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))
        )
        #wait容易引发timeout
        return totle.text  #然后将页数返回

#定义一个main函数  作为最终调用
def main():
    total = search()
    total = int(re.compile('(\d+)').search(total).group(1))
    #只需要获取关键的数字
    print(total)

我们现在需要获取,当前的页数,以及翻到哪一页了,这两者匹配才可以。

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"))  # 使用css选择器 因为是class所以是#q  这是查看淘宝搜索框得到的
        )
        # 查看官方文档
        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()

        #判断高亮位置数字
        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))
            # 使用css选择器
        )

    except TimeoutException:
        next_page(page_number)
分析提取商品信息

导入from pyquery import PyQuery as pq

#解析网页
def get_products():
    #先判断是否加载完毕

    wait.until(
         EC.presence_of_all_elements_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items item'))
    )

    html = browsr.page_source #获取网页源码
    doc = pq(html)#解析
    #获取所有选择内容
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        product = {
            #find  选择器   img这个标签下的
            'image' : item.find('.pic .img').attr('data-src'), #src属性
            #'title' : item.find('.row .H').text(),
            'title': item.find('.J_ClickStat').text(),
            'sell' : item.find('.deal-cnt').text(),
            'price': item.find('.price').text(),
            'localtion':item.find('.location').text(),
            'shop' : item.find('.shop').text()
        }
        print(product)

这个应该很容易理解,纯粹获取Item内容。
这里写图片描述
多种方式都可以获取到内容!

以上就是Selenium的简单使用。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值