0x00写在前面

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

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

最后,是Selenium拯救了我

0x01环境搭建

安装selenium模块

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

1
pip install -U selenium

我用的是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()

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