一次性付费进群,长期免费索取教程,没有付费教程。
进微信群回复公众号:微信群;QQ群:460500587
教程列表 见微信公众号底部菜单 | 本文底部有推荐书籍微信公众号:计算机与网络安全
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 hst_king@hotmail.com'
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
【推荐书籍】