Python爬虫_Selenium&PhantomJS实例(一)

一次性付费进群,长期免费索取教程,没有付费教程。

进群回复:群;群:

 教程列表 见底部菜单 |  本文底部有推荐书籍 

:计算机与网络安全

ID:Computer-network

用Selenium&PhantomJS完成的网络爬虫,最适合使用的情形是爬取有JavaScript的网站,但用来爬其他的站点也一样给力。在Scrapy爬虫中曾爬取过代理服务器的例子,这里再以Selenium&PhantomJS爬取代理服务器为示例,比较两者有什么不同。

1、准备环境

在Scrapy爬虫中获取了代理,需要自行验证代理是否可用。这次将在www.kuaidaili.com中获取已经验证好了的代理服务器。打开目标站点主页,如图1所示。

图1  目标主页

最终需要获取的有效数据就是代理服务器。从中可以看出网站也给出了API接口。从好的方面想,有现成的API接口获取代理服务器会更加方便;但从坏的方面考虑,因为本身就有API接口,那么限制爬虫恐怕就更加方便了。

单击API接口的链接查看一下,如图2所示。

图2  API限制条件

还好,限制的条件不多,无须添加复杂的反爬虫。下面准备爬虫项目环境,打开Putty,连接登录到Linux,进入爬虫项目目录,执行命令:

mkdir -pv selenium/kuaidaili

cd $_

执行结果如图3所示。

图3  准备工作目录

下面就可以在该目录下编写爬虫文件getProxyFromKuaidaili.py。

2、爬虫代码

getProxyFromKuaidaili.py的代码如下:

1 #!/usr/bin/env python3

2 #-*- coding: utf-8 -*-

3 __author__ = hstking [email protected]

4

5

6 from selenium import webdriver

7 from myLog import MyLog as mylog

8 import codecs

9

10 pageMax = 10 #爬取的页数

11 saveFileName = proxy.txt

12

13 class Item(object):

14         ip = None #代理IP地址

15         port = None #代理IP端口

16         anonymous = None #是否匿名

17         protocol = None #支持的协议http or https

18         local = None #物理位置

19         speed = None #测试速度

20         uptime = None #最后测试时间

21

22 class GetProxy(object):

23         def __init__(self):

24                 self.startUrl = https://www.kuaidaili.com/free

25                 self.log = mylog()

26                 self.urls = self.getUrls()

27                 self.proxyList = self.getProxyList(self.urls)

28                 self.fileName = saveFileName

29                 self.saveFile(self.fileName, self.proxyList)

30

31         def getUrls(self):

32                 urls = []

33                 for word in [inha, intr]:

34                         for page in range(1, pageMax + 1):

35                                 urlTemp = []

36                                 urlTemp.append(self.startUrl)

37                                 urlTemp.append(word)

38                                 urlTemp.append(str(page))

39                                 urlTemp.append()

40                                 url = /.join(urlTemp)

41                                 urls.append(url)

42                 return urls

43

44

45         def getProxyList(self, urls):

46                 proxyList = []

47                 item = Item()

48                 for url in urls:

49                         self.log.info(crawl page :%s %url)

50                         browser = webdriver.PhantomJS()

51                         browser.get(url)

52                         browser.implicitly_wait(5)

53                         elements =browser.find_elements_by_xpath(//tbody/tr)

54                         for element in elements:

55                                 item.ip =element.find_element_by_xpath(./td[1]).text

56                                 item.port =element.find_element_by_xpath(./td[2]).text

57                                 item.anonymous =element.find_element_by_xpath(./td[3]).text

58                                 item.protocol =element.find_element_by_xpath(./td[4]).text

59                                 item.local =element.find_element_by_xpath(./td[5]).text

60                                 item.speed =element.find_element_by_xpath(./td[6]).text

61                                 item.uptime =element.find_element_by_xpath(./td[7]).text

62                                 proxyList.append(item)

63                                 self.log.info(add proxy %s:%s to list%(item.ip, item.port))

64                         browser.quit()

65                 return proxyList

66

67         def saveFile(self, fileName, proxyList):

68                 self.log.info(add all proxy to %s %fileName)

69                 with codecs.open(fileName, w, utf-8) as fp:

70                         for item in proxyList:

71                                 fp.write(%s \t %item.ip)

72                                 fp.write(%s \t %item.port)

73                                 fp.write(%s \t %item.anonymous)

74                                 fp.write(%s \t %item.protocol)

75                                 fp.write(%s \t %item.local)

76                                 fp.write(%s \t %item.speed)

77                                 fp.write(%s \r\n %item.uptime)

78

79

80 if __name__ == __main__:

81         GP = GetProxy()

按Esc键,进入命令模式后输入:wq保存结果,再将之前项目中用过的myLog.py复制到当前目录下。查看当前目录,执行命令:

tree

执行结果如图4所示。

图4  显示目录文件

运行爬虫文件,执行命令:

python3 getProxyFromKuaidaili.py

tree

执行结果如图5所示。

图5  运行爬虫

这里的getProxyFromKuaidaili.log是用户定义的日志文件。Proxy.txt是最终得到的结果。Ghostdriver.log是运行PhantomJS的日志文件。

3、代码解释

这个爬虫程序本身并不复杂。第6~8行是导入所需的模块,其中myLog模块是自定义模块,也就是后来复制到当前目录的myLog.py文件。

第10~11行定义了2个全局变量。变量在类中定义也可以,放在这里是为了修改起来比较方便。

第13~20行定义了一个Item类。这个类的作用是为了方便装载爬虫获取的数据,基本包含了网页中的所有项。

第22~77行定义了一个从kuaidili站点中获取proxy的类。这个类包含了3个类函数。getUrls函数用于返回一个列表,这个列表包含了所有有效数据的网页地址。getProxyList函数从网页中获取有效数据,并保存到一个列表中。最后的saveFile函数将所有列表中的数据保存到文件中。

:计算机与网络安全

ID:Computer-network

【推荐书籍】