selenium简单使用,beautifulsoup始终beautiful

至此,简书在Twitter、豆瓣、微博上的活动(持续更新)所需的所有爬虫技能已经更新完毕。结合下面两篇文章,可以完成Twitter,豆瓣,微博的爬虫,如果没有阅读前两篇文章,建议读一下,新文章一般不会涉及旧文的知识点。

简单网站爬虫的所有技能(requests+bs4)
爬虫中的正则表达式

写在前面

为什么要用selenium?
因为它简单粗暴有效,当然缺点也一大堆,:)。每一个工具或者方法都有它的优点和局限,要选择适合的,而不是网上所谓“最叼的”。

还有为什么标题是selenium的简单使用,因为….selenium较难的部分嘛,我也不会,很多知识我都是现学现用的。还记得EasyCharts团队成员杜雨向我提了关于selenium的问题,我一个都不会。

如果有时间,我就写写进阶一点的用法,比如网易云课堂的爬虫,>_<。至于为什么加beautifulsoup始终beautiful,这个嘛看看爬虫中的正则表达式,在正则这篇文章中我提到 sometimes beautifulsoup is not beautiful

案例说明

爬取简书新浪微博第一页的源代码
http://weibo.com/2855893887/profile?is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page=1

这里的源代码是指浏览器检查功能对应的源代码,而不是查看网页源代码功能对应的源代码。

想象一下,这意味着什么?为什么又说beautifulsoup始终beautiful

简单粗暴的实现

Talk is cheap. Show you the code
我会写好注释

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
# -*- coding: utf-8 -*-
__author__ = 'duohappy'

import time

from selenium import webdriver

def simple_method(url):
# 使用Edge浏览器,可以试试其他的浏览器,应该有意外收获,:)
driver = webdriver.Edge()
# 窗口最大化
driver.maximize_window()

# 请求网页
driver.get(url)
# 等网页加载一会,其实嘛,你可以试试删除这条语句
time.sleep(2)

# 计数变量
num = 0
while True:
# 控制滚动条的js代码
js = "window.scrollTo(0, document.body.scrollHeight)"

# 执行一次js,计数+1
num += 1
driver.execute_script(js)
# 每次执行后,等一会,让网页加载完毕
# 是不是一定要2s,这个是我随便设置的,记住!先自己动手试试!
time.sleep(2)
# 执行了5次js后,我觉得网页应该全部加载完毕了,是不是这样的呢?自己试试
if num == 5:
# 把网页源代码写入文件中,用浏览器打开这个文件看看
with open('./page_simple.html', 'w', encoding='utf-8') as f:
f.write(driver.page_source)
# 退出Edge
driver.quit()
# 结束循环
break

if __name__ == '__main__':
url = 'http://weibo.com/2855893887/profile?is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page=1'
simple_method(url)

另一种思路

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
# -*- coding: utf-8 -*-
__author__ = 'duohappy'

import time

from selenium import webdriver

def difficult_method(url):
driver = webdriver.Edge()
driver.maximize_window()

driver.get(url)
# 随便设置的等待时间
time.sleep(3)

js = "window.scrollTo(0, document.body.scrollHeight)"

while True:
try:
# 如果网页里有div.W_pages,那就证明加载完成了
driver.find_element_by_css_selector('div.W_pages')
break
except Exception as e:
# 如果没有,那么继续滚动吧
driver.execute_script(js)

with open('./page_difficult.html', 'w', encoding='utf-8') as f:
f.write(driver.page_source)

driver.quit()

if __name__ == '__main__':
url = 'http://weibo.com/2855893887/profile?is_search=0&visible=0&is_all=1&is_tag=0&profile_ftype=1&page=1'
difficult_method(url)

写在后面

本文仅仅涉及selenium极少的知识点,如果你之前不了解selenium,希望本文能给你打开一个新的窗口,让你的爬虫兵器库中多一件称手的兵器。顺便提一下,selenium有一个坑,这个可以看文章爬虫踩过的坑

本章中的代码不算优雅,但是确实能解决问题,欢迎批评指正,:)

要是你愿意把你更加优雅的方法共享出来,万分感谢

您的支持将鼓励我继续创作!