selenium + Chrome 模拟浏览器爬淘宝信息

环境:

ubuntu16.04
python3.5.2
版本 67.0.3396.87(正式版本) (64 位)
chromedriver 2.40

安装所需工具:

  • 1 selenium三方库安装
pip install selenium  # 安装selenium库
  • 2 chromedriver安装
    chromedriver官网地址: http://chromedriver.storage.googleapis.com/index.html
    选择合适的版本安装,解压,把解压的文件放入/usr/bin/目录下即可:
mv chromedriver /usr/bin/
  • python下测试chromedriver:
from selenium import webdriver  # 引入驱动对象
driver = webdriver.Chrome()   # 生成谷歌浏览器对象
driver.get('http://www.baidu.com')  #访问百度

----浏览器会自动打开一个新的页面并访问百度,成功说明安装配置成功.----


分析淘宝页面并执行selenium

python selenium官网地址: http://selenium-python.readthedocs.io/

#coding:utf-8
import re
from bs4 import BeautifulSoup
from selenium.common.exceptions import TimeoutException
from selenium import webdriver
#这几个都是从selenium官网套用的
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 谷歌浏览器驱动对象
browser = webdriver.Chrome()
# selenium和PhantomJS分手了,现在可以用无头浏览器FireFox或者Chrome代替
# browser = webdriver.PhantomJS()
wait = WebDriverWait(browser, 10)

# 打开淘宝页面并输入"美食"
def search():
    try:
        browser.get('https://www.taobao.com/')
        # 等待10秒直到找到輸入框  通過css选择器语法来实现
        input_button = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
        )
        # 等待10秒直到找到搜索按钮  通過css选择器语法来实现
        submmit = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#J_TSearchForm > div.search-button > button"))
            )
        # 用send_keys()方法輸入"美食"
        input_button.send_keys('美食')
        # 用click()方法点击搜索按钮
        submmit.click()
        # 关键词搜索出来在淘宝中的页数
        total = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.total"))
        )
        return total.text
    # timeout报错 递归调用自己
    except TimeoutException:
        return search()


# 翻页函数
def next_page(page_number):
    try:
        # 等待10秒直到找到輸入框  通過css选择器语法来实现
        # 淘宝返回页下面的跳转的输入框: 第 [1] 页
        input_button = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > input"))
        )
        # 等待10秒直到找到搜索按钮  通過css选择器语法来实现
        # 淘宝返回页下面的跳转按钮:第 [1] 页 确认
        submmit = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit"))
            )
        # 清楚内容
        input_button.clear()
        # 输入跳转页码
        input_button.send_keys(page_number)
        # 点击跳转
        submmit.click()
        # 等待跳转后 高亮的页码数字是不是page_number,一定注意参数((By.CSS_SELECTOR,'css语法'),(text))
        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))
            )
    except TimeoutException:
        next_page(page_number)


# 商品详情解析,这里只做了打印输入并未保存在数据库
def get_products():
    wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#mainsrp-itemlist > div > div > div:nth-child(1) > div:nth-child(1) > div.ctx-box.J_MouseEneterLeave.J_IconMoreNew"))
            )
    res = browser.page_source
    html = BeautifulSoup(res, 'html.parser')
    # 每个上坪详情列表结果
    items= html.find_all('div',{'class':'ctx-box J_MouseEneterLeave J_IconMoreNew'})
    for item in items:
        print({
            'price':item.find('div',{'class':'price g_price g_price-highlight'}).find('strong').string,
            'pay_nums':item.find('div',{'class':'deal-cnt'}).string,
            'name':item.find('div',{'class':'row row-2 title'}).find('a').get_text().replace('\n','').replace(' ',''),
            'location':item.find('div',{'class':'location'}).string

            })


# 主函数
def main():
    total = search()
    # 返回的是字符串,正则匹配返回页码数字
    total = int(re.compile('(\d+)').search(total).group(1))
    # print(type(total))
    for i in range(2,total+1):
        get_products()
        next_page(i)



if __name__ == '__main__':
    main()

总结:

本人大四小白,不喜勿碰.如有错误欢迎指正,一起学习,共同进步.

  • PhantomJS
    本来打算用Phantomjs代替界面化浏览器结果发现,selenium和PhantomJS分道扬镳了,不过可以用无头FireFox或者Chrome浏览器代替.这里没有做研究.

你可能感兴趣的:(Python爬虫)