爬虫实践教程2

这里先介绍一下,我们使用工具selenium和Phantomjs来配合抓取。
安装的话, 直接

pip install -U selenium

而Phantomjs则通过brew来安装,不细说。

brew install phantomjs

选择原因:
Phantomjs是基于webkit的没有界面的浏览器,可以像浏览器一样解析网页,个人感觉的效果比firefox和chrome稍微快些。
selenium是web的自动测试工具,可以模拟人的操作。几乎支持市面上所有的主流浏览器。

来看看代码

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
#coding:utf-8
import unittest
from selenium import webdriver
from bs4 import BeautifulSoup


class seleniumTest(unittest.TestCase):
def setUp(self):
self.driver = webdriver.PhantomJS()

def testEle(self):
driver = self.driver
driver.get('http://www.douyu.com/directory/all')
soup = BeautifulSoup(driver.page_source, 'xml')
while True:
titles = soup.find_all('h3', {'class': 'ellipsis'})
nums = soup.find_all('span', {'class': 'dy-num fr'})
for title, num in zip(titles, nums):
print title.get_text(), num.get_text()
if driver.page_source.find('shark-pager-disable-next') != -1:
break
elem = driver.find_element_by_class_name('shark-pager-next')
elem.click()
soup = BeautifulSoup(driver.page_source, 'xml')

def tearDown(self):
print 'down'

if __name__ == "__main__":
unittest.main()

这里一些概念说明:
1.unittest 单元测试,简单的测试用例。以setup开头,中间测试的方法以test开头,测试完成之后会有一个teardown。
2.斗鱼tv是看直播时较常去的,直接用浏览器打开 斗鱼
网页源码中可以直接看到房间的信息,返回的不是json格式而是html,直接使用phantomjs模拟浏览器的访问过程,通过driver.get方法获取浏览器加载完成后的代码,无论是否是异步,取到的source都是和在浏览器中看到的完全一样!

这里lxml方式有数据丢失,原因未知。。后来尝试了xml无误,暂时不知原因。。

还有对比之前的瓜子和果壳,我们只从中抓取了部分页面。这里抓取全部我们需要加上条件判断,最后一页时斗鱼下一页的标签会变灰,这个时候我们就加上这个跳出循环。

if driver.page_source.find('shark-pager-disable-next') != -1: 
    break  

还有这里

elem = driver.find_element_by_class_name('shark-pager-next') 
elem.click() 
soup = BeautifulSoup(driver.page_source, 'xml')

第一行代码是webdriver里面带有的定位标签的方法,直接使用class来定位,取到这个控件,
然后执行element的click()方法模拟鼠标的点击,
页面会自动跳到下一页,接着解析网页的源码。

tips
这里加上一点selenium的小操作
编码学习的一个小突破感觉就是不断滴回顾学习吧,有些看完文档之后,觉得是这样没错,可是不久就好像啥也不剩了,在基础阶段模范性学习当中,要不断深化下已经学到的东西,适当做些归纳总结会很好。

填入表单数据

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get('https://www.baidu.com/')
elem = driver.find_element_by_id('kw')
elem.send_keys(u'爬虫')
elem.send_keys(Keys.RETURN)
print(driver.page_source)

滚动页面至最下方

#coding:utf-8
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get('http://www.jianshu.com/collections')
time.sleep(1)
for i in range(10):
    dirver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    time.sleep(1)