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

进微信群回复公众号:微信群;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

【推荐书籍】

phantomjs debian不显示中文_Python 爬虫:Seleniumamp;PhantomJS 实例(一)相关推荐

  1. python2.7显示中文_Python 2.7中文显示与处理方法

    在学习使用Python的过程中,一定会遇到文字输入与处理,这就不可避免的会使用中文字符.但是Python2.7默认使用的字符集是ASCII,并不支持中文字符的显示与处理,因些如果要在Python中处理 ...

  2. debian 8显示中文

    切换选择语言 dpkg-reconfigure locales 进入选择: zh_CN GB2312 zh_CN.GBK GBK zh_CN.UTF-8 UTF-8 en_US.UTF-8 UTF-8 ...

  3. python画图显示中文_Python的matplotlib库画图不能显示中文问题解决

    有两种解决办法: 一种是在代码里设置为能显示中文的字体,如微软雅黑(msyh.ttf)和黑体(simsun.ttc) 如下在要画图的代码前添加: import matplotlib.pyplot as ...

  4. pythonscrapy爬虫_Python 爬虫:Scrapy 实例(二)

    原标题:Python 爬虫:Scrapy 实例(二) 稍微增加点难度,做个所需项目多一点的,并将的结果以多种形式保存起来.我们就从网络天气预报开始. 首先要做的是确定网络天气数据的来源.打开百度,搜索 ...

  5. python窗口显示表格_Python爬虫之GUI图表

    关于Python爬虫系列的这篇文章我很早就想写了,但由于我前两周一直在研究vscode插件开发方面,就没去写文章.所幸目前vscode插件开发的知识了解的差不多了,是时候写了,哈哈.需要说明的是,我并 ...

  6. python 显示中文_Python|绘制个性化数据的动态图表及解决中文显示问题……

    先安装各个库文件,以下为我的win10系统安装的Python版本及各个库文件的版本,安装命令如下: pip3 install 库文件名==版本号 -i https://pypi.tuna.tsingh ...

  7. 微博爬取显示全文_Python爬虫---chrome driver爬取微博(教你几十行代码爬取财宝宝微博长文)...

    0.学习路径示意图 各位小伙伴大家好,这次博主分享的是利用虚拟浏览器ChromeDriver去爬取微博大V--财宝宝的微博长文. 1.ChromeDriver简介 WebDriver是一个开源工具,用 ...

  8. python代码html显示数据_Python爬虫基础之认识html和学习数据提取(上)

    我:我已经学会了基本的python,接下来可以学什么鸭? 惨绿青年:接下来可以学习制作python爬虫了,但还是需要学习相关的知识. 我:什么知识鸭? 惨绿青年:网页的相关知识.我们看到的网页一般是h ...

  9. python画图标题怎么显示中文_python画图如何显示中文标题?

    我们用Python进行数据可视化,绘制各种图形时,往往会遇到明明数据都设置对了,但是在图形上中文标题显示不出来. 例如绘制直方图,程序如下:plt.hist(roll_list, bins=range ...

最新文章

  1. 微软亚研院提出用于语义分割的结构化知识蒸馏 | CVPR 2019
  2. awk匹配以aaa开头,以bbb结尾的内容,同时aaa和bbb之间还包含ccc
  3. Win10上线摸鱼神器,已经被玩疯了!
  4. 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
  5. dart系列之:元世界pubspec.yaml文件详解
  6. 禁用CMFCRibbonApplicationButton的单击和双击事件
  7. 一个备份sql server文件.bak还原成两个数据库
  8. Linux 编译pe,如何在PE中将PE(可移植可执行文件)格式转换为ELF
  9. 实现一个简单的HTTP
  10. WinAPI: CreatePen - 建立画笔
  11. [LCT刷题][连通性维护] P3950 部落冲突
  12. 微信小程序在智能家居物联网中的应用
  13. SAP JCo 3.0 下载
  14. 解析无线地磁传感器的防水设计
  15. 关于adsl宽带猫的一个奇怪问题
  16. android 自定义输入法布局,Android自定义输入法使用方法
  17. Devops 开发运维基础篇之使用Maven构建项目
  18. (转)银河麒麟V10sp1服务器系统安装redis不能使用的解决办法
  19. 花朝节汉服摄影征集、照片征集、视频征集小程序
  20. Soul新发布录音有电流 杂音 m4a文件夹 解决方法

热门文章

  1. Linux开机启动过程(7):内核执行入口点
  2. C语言嵌入汇编指令(asm)查询系统时间
  3. QQ炫舞登录完后服务器没显示,qq炫舞进入界面后就没有了怎么回?
  4. ospf协议_「案例」OSPF路由动态协议及配置
  5. python守护进程_让Python脚本成为守护进程
  6. web前端基础(14html里面的事件)
  7. hook(钩子函数)
  8. Idea代码统计工具
  9. linux ll命令时间,linux ll显示时间格式
  10. php 快速找到php.ini位置