在前面的Scrapy爬虫里,我们已经写了一个爬取代理的爬虫了,这次我们通过模拟浏览器用Selenium&PhantomJS的方式重新写一遍,来看看这两者有啥不同。
目录
目标分析:
本次要爬的网站是:快代理 :快代理 - 高速http代理ip每天更新
虽然这个网站并没有对爬虫限制,我们用requests库就能顺利get页面代码,但是为了掌握Selenium的使用方式,我们还是来通过这种方式写一遍。
看一下页面的样子:
我们就按这种布局,在html页面里找到代理的 ip 端口 位置等信息。
数据的筛选:
打开Chrome开发者工具,手动定位到一条代理的位置:
可以看到,每条代理都放在tr列表中,每个tr里有包含着多个td列来显示不同的信息。
这样的结构我们可以通过多种方法来定位数据
bs4XpathSelenium自带的方法具体代码怎么写,我相信大家都会有自己的方式吧
代码的书写:
这次我们采用面向对象的方式写这一段代码:
selenium模拟浏览器爬虫 爬取快代理: from selenium import webdriver class Item(object): 我们模拟Scrapy框架 写一个item类出来, 用来表示每一个爬到的代理 ip = None# ip地址 port = None# 端口 anonymous = None# 是否匿名 type = None# http or https local = None# 物理地址 speed = None# 速度 class GetProxy(object): 获取代理的类 def __init__(self): 初始化整个类 self.starturl = free/inha/ self.urls = self.get_urls() self.proxylist = self.get_proxy_list(self.urls) self.filename = proxy.txt self.saveFile(self.filename,self.proxylist) def get_urls(self): 返回一个代理url的列表 urls = [] for i in range(1,2): url = self.starturl+str(i) urls.append(url) return urls def get_proxy_list(self,urls): 返回抓取到代理的列表 整个爬虫的关键 browser = webdriver.PhantomJS() proxy_list = [] for url in urls: browser.get(url) browser.implicitly_wait(3) # 找到代理table的位置 elements = browser.find_elements_by_xpath(//tbody/tr) for element in elements: item = Item() item.ip = element.find_element_by_xpath(./td[1]).text item.port = element.find_element_by_xpath(./td[2]).text item.anonymous = element.find_element_by_xpath(./td[3]).text item.local = element.find_element_by_xpath(./td[4]).text item.speed = element.find_element_by_xpath(./td[5]).text print(item.ip) proxy_list.append(item) browser.quit() return proxy_list def saveFile(self,filename,proxy_list): 将爬取到的结果写到本地 with open(filename,w) as f: for item in proxy_list: f.write(item.ip + \t) f.write(item.port + \t) f.write(item.anonymous + \t) f.write(item.local + \t) f.write(item.speed + \n\n) if __name__ ==__main__: Get = GetProxy()代码解释:
这次的爬虫本身十分的简单,详细的注释也都附在代码里了,相信一路跟着这份笔记走过来的同学都能看的明白。
但是我还是稍微解释一下吧:
一开始我们模仿Scrapy定义了一个ITEM类,每一个item都包含了一条结果所需要的所有数据,然后一条一条传回去给其他函数调用。
接着我们写了三个函数:
get_urls()
这个函数功能是返回一个需要爬取代理页面的url链接的列表
get_proxy_list()这个函数通过Selenium和PhantomJS模拟一个浏览器环境,首先 从get_urls函数返回的列表中拿出一个链接,打开接着 在浏览器里通过find_elements_by_xpath()方法来找到每一条我们需要的数据,并保存在item里。最后 将item返回给saveFile()函数处理。
saveFile()这个函数没什么好说的,就是将item理的数据写入到本地。保存在proxy.txt文本中。
结果展示:
为了节省调式的时间,我只爬取了前两页的代理,
结果保存在proxy.txt:
117.90.3.1539000高匿名 HTTP中国 江苏省 镇江市 电信 202.111.9.106 23高匿名 HTTP中国 江苏省 常州市 联通 27.29.158.127 8998高匿名 HTTP中国 湖北省 襄樊市 电信 117.90.3.1149000高匿名 HTTP中国 江苏省 镇江市 电信 120.24.182.1758118高匿名 HTTP中国 广东省 深圳市 阿里云 121.232.144.219000高匿名 HTTP中国 江苏省 镇江市 电信 59.78.47.1841080高匿名 HTTP中国 上海市 上海市 教育网 58.218.145.1638998高匿名 HTTP中国 江苏省 徐州市 电信 121.232.145.139 9000高匿名 HTTP中国 江苏省 镇江市 电信 117.90.4.2199000高匿名 HTTP中国 江苏省 镇江市 电信 175.8.26.191808 高匿名 HTTP中国 湖南省 长沙市 电信 171.12.166.209808 高匿名 HTTP中国 河南省 漯河市 电信 121.232.144.449000高匿名 HTTP中国 江苏省 镇江市 电信 117.90.5.2299000高匿名 HTTP中国 江苏省 镇江市 电信当然,如果要真的用的话,还需要配合我上次写的代理验证程序~
好了,这次就到这里,相信会写这个简单的Selenium模拟浏览器爬虫,
其他复杂的网站也是能一通百通的。
每天的学习记录都会 同步更新到:: findyourownway知乎专栏:从零开始写Python爬虫 - 知乎专栏blog : www.ehcoblog.mlGithub: Ehco1996/Python-crawler