thumbnail
Selenium爬虫入门

0x00写在前面

曾经我以为爬虫只要学会get和post就行了

直到遇上了某些不分离的js原生网页

最后,是Selenium拯救了我

0x01环境搭建

安装selenium模块

这里是使用python里的selenium模块;java的话,也有selenium的jar包

pip install -U selenium

我用的是PyCharm,可以直接在里面的包管理工具添加这个包

安装浏览器

安装一款浏览器(谷歌,火狐,IE),selenium是基于浏览器运作的,想要selenium能驱动浏览器,必须要安装浏览器驱动,将驱动放到python的安装根目录下即可

此处以谷歌浏览器为例:谷歌驱动(chromedriver)下载地址:http://npm.taobao.org/mirrors/chromedriver

0x02使用

from selenium import webdriver       #引用selenium
driver=webdriver.Chrome() #启动谷歌浏览器
driver.get("http://www.baidu.com") #访问一个网页 
driver.quit() #退出浏览器
driver.get("http://www.baidu.com")  #访问浏览器
driver.back()       #回到上一页
driver.forward()    #回到下一页
driver.refresh()        #刷新
print(driver.title)        #获取标题
print(driver.current_url)        #获取网址
print(driver.current_window_handle)        #获取到句柄
print(driver.get_window_size())       #获取浏览器尺寸
print(driver.get_screenshot_as_file(''))       #获取截图
driver.maximize_window()              #窗口最大化
driver.minimize_window()              #窗口最小化

0x03示例

这次参加了学校里的一场比赛,其中有一道题就是爬取各个购物平台的商品数据

我第一个选择了某宝,这里放出示例代码

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from urllib.parse import quote
from pyquery import PyQuery as pq
import time

browser = webdriver.Chrome()
# 需要手动扫码登陆淘宝!
wait = WebDriverWait(browser, 20)


def taobao_index_page(page, text):
    print('正在爬取第', page, '页')
    try:
        # 网址url
        url = 'https://s.taobao.com/search?q=' + quote(text)
        browser.get(url)
        time.sleep(1.5)
        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(page)
            # 模拟点击确认
            submit.click()
        # 找到每页数据的标签
        wait.until(
            EC.text_to_be_present_in_element((By.CSS_SELECTOR, '#mainsrp-pager li.item.active > span'), str(page))
        )
        wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.m-itemlist .items .item'))
        )
        # 调用函数,获取数据
        taobao_get_products()
    except TimeoutException:
        taobao_index_page(page, text)


def taobao_get_products():
    # page_source获取网页源代码
    html = browser.page_source
    doc = pq(html)
    items = doc('#mainsrp-itemlist .items .item').items()
    for item in items:
        # 数据存入字典
        product = {
            'title': item.find('.title').text(),
            'price': item.find('.price').text(),
            'image': item.find('.pic .img').attr('data-src'),
        }
        print(product)

def main():
    for i in range(1, 10):#爬取1-9页
        taobao_index_page(i, "iphone13")

if __name__ == '__main__':
    main()

另外,对于某些页面的懒加载问题,可以自己想想看如何解决(

上一篇
下一篇