0x00写在前面 曾经我以为爬虫只要学会get和post就行了
直到遇上了某些不分离的js原生网页
最后,是Selenium拯救了我
0x01环境搭建 安装selenium模块 这里是使用python里的selenium模块;java的话,也有selenium的jar包
我用的是PyCharm,可以直接在里面的包管理工具添加这个包
安装浏览器 安装一款浏览器(谷歌,火狐,IE),selenium是基于浏览器运作的,想要selenium能驱动浏览器,必须要安装浏览器驱动,将驱动放到python的安装根目录下即可
此处以谷歌浏览器为例:谷歌驱动(chromedriver)下载地址:http://npm.taobao.org/mirrors/chromedriver
0x02使用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 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示例 这次参加了学校里的一场比赛,其中有一道题就是爬取各个购物平台的商品数据
我第一个选择了某宝,这里放出示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 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()
另外,对于某些页面的懒加载问题,可以自己想想看如何解决(