首页 > 代码库 > 2017.08.05 Python网络爬虫实战之获取代理

2017.08.05 Python网络爬虫实战之获取代理

1.项目准备:爬取网站:http://www.proxy360.cn/Region/China,http://www.xicidaili.com/

2.创建编辑Scrapy爬虫:

scrapy startproject getProxy

scrapy genspider proxy360Spider proxy360.cn

项目目录结构:

技术分享

 

3.修改items.py:

技术分享

 

 4.修改Spider.py文件 proxy360Spider.py:

(1)先使用scrapy shell命令查看一下连接网络返回的结果和数据:

scrapy shell http://www.proxy360.cn/Region/China

技术分享

(2)再看一下response的数据内容:response.xpath(‘/*‘).extract(),返回的数据中含有代理服务器;

技术分享

(3)观察发现所有的数据模块都是以<div class="proxylistitem" name="list_proxy_ip">这个tag开头的:

技术分享

(4)在scrapy shell中测试一下:

subSelector=response.xpath(‘//div[@class="proxylistitem" and @name="list_proxy_ip"]‘)

subSelector.xpath(‘.//span[1]/text()‘).extract()[0]

 subSelector.xpath(‘.//span[2]/text()‘).extract()[0]

 subSelector.xpath(‘.//span[3]/text()‘).extract()[0]

 subSelector.xpath(‘.//span[4]/text()‘).extract()[0]

技术分享

 

(5) 编写Spider文件 proxy360Spider.py:

# -*- coding: utf-8 -*-
import scrapy
from getProxy.items import GetproxyItem

class Proxy360spiderSpider(scrapy.Spider):
name = ‘proxy360Spider‘
allowed_domains = [‘proxy360.cn‘]

nations=[‘Brazil‘,‘China‘,‘Amercia‘,‘Taiwan‘,‘Japan‘,‘Thailand‘,‘Vietnam‘,‘bahrein‘]
start_urls=[ ]
for nation in nations:
start_urls.append(‘http://www.proxy360.cn/Region/‘+nation)

def parse(self, response):
subSelector=response.xpath(‘//div[@class="proxylistitem" and @name="list_proxy_ip"]‘)
items=[]
for sub in subSelector:
item=GetproxyItem()
item[‘ip‘]=sub.xpath(‘.//span[1]/text()‘).extract()[0]
item[‘port‘]=sub.xpath(‘.//span[2]/text()‘).extract()[0]
item[‘type‘]=sub.xpath(‘.//span[3]/text()‘).extract()[0]
item[‘loction‘]=sub.xpath(‘.//span[4]/text()‘).extract()[0]
item[‘protocol‘]=‘HTTP‘
item[‘source‘]=‘proxy360‘
items.append(item)
return items



(6)修改pipelines.py文件,处理:
# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html


class GetproxyPipeline(object):
def process_item(self, item, spider):
fileName=‘proxy.txt‘
with open(fileName,‘a‘) as fp:
fp.write(item[‘ip‘].encode(‘utf8‘).strip()+‘\t‘)
fp.write(item[‘port‘].encode(‘utf8‘).strip()+‘\t‘)
fp.write(item[‘protocol‘].encode(‘utf8‘).strip()+‘\t‘)
fp.write(item[‘type‘].encode(‘utf8‘).strip()+‘\t‘)
fp.write(item[‘loction‘].encode(‘utf8‘).strip()+‘\t‘)
fp.write(item[‘source‘].encode(‘utf8‘).strip()+‘\n‘)
return item


(7)修改Settings.py,决定由哪个文件来处理获取的数据:

技术分享

(8)执行结果:

技术分享

 

5.多个Spider,只有一个Spdier的时候得到的proxy数据不够多:

(1 )到getProxy目录下,执行:scrapy  genspider xiciSpider xicidaili.com

技术分享

(2)确定如何获取数据:scrapy shell http://www.xicidaili.com/nn/2

技术分享

 (3)只需要在settings.py中添加一个USER_Agent项就可以了

技术分享

再次测试如何获取数据:scrapy shell http://www.xicidaili.com/nn/2

技术分享

(4)在浏览器中查看源代码:发现所需的数据块都是以<tr class="odd">开头的

技术分享

(5)在scrapy shell中执行命令:

 subSelector=response.xpath(‘//tr[@class=""]| //tr[@class="odd"]‘)

subSelector[0].xpath(‘.//td[2]/text()‘).extract()[0]

 subSelector[0].xpath(‘.//td[3]/text()‘).extract()[0]

 subSelector[0].xpath(‘.//td[4]/a/text()‘).extract()[0]

subSelector[0].xpath(‘.//td[5]/text()‘).extract()[0]

subSelector[0].xpath(‘.//td[6]/text()‘).extract()[0]

技术分享

 

(6)编写xiciSpider.py:

# -*- coding: utf-8 -*-
import scrapy
from getProxy.items import GetproxyItem

class XicispdierSpider(scrapy.Spider):
name = ‘xiciSpdier‘
allowed_domains = [‘xicidaili.com‘]
wds=[‘nn‘,‘nt‘,‘wn‘,‘wt‘]
pages=20
start_urls=[]
for type in wds:
for i in xrange(1,pages+1):
start_urls.append(‘http://www.xicidaili.com/‘+type+‘/‘+str(i))


def parse(self, response):
subSelector=response.xpath(‘//tr[@class=""]| //tr[@class="odd"]‘)
items=[]
for sub in subSelector:
item=GetproxyItem()
item[‘ip‘]=sub.xpath(‘.//td[2]/text()‘).extract()[0]
item[‘port‘]=sub.xpath(‘.//td[3]/text()‘).extract()[0]
item[‘type‘]=sub.xpath(‘.//td[5]/text()‘).extract()[0]
if sub.xpath(‘.//td[4]/a/text()‘):
item[‘loction‘]=sub.xpath(‘.//td[4]/a/text()‘).extract()[0]
else:
item[‘loction‘]=sub.xpath(‘.//td[4]/text()‘).extract()[0]

item[‘protocol‘]=sub.xpath(‘.//td[6]/text()‘).extract()[0]
item[‘source‘]=‘xicidaili‘
items.append(item)


return items

 (7)执行:scrapy crawl xiciSpider

结果:

技术分享

 

 

6.验证获取的代理服务器地址是否可用:另外写一个python程序验证代理:testProxy.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-


import urllib2
import re
import threading

class TesyProxy(object):
def __init__(self):
self.sFile=r‘proxy.txt‘
self.dFile=r‘alive.txt‘
self.URL=r‘http://www.baidu.com/‘
self.threads=10
self.timeout=3
self.regex=re.compile(r‘baidu.com‘)
self.aliveList=[]

self.run()

def run(self):
with open(self.sFile,‘r‘) as fp:
lines=fp.readlines()
line=lines.pop()
while lines:
for i in xrange(self.threads):
t=threading.Thread(target=self.linkWithProxy,args=(line,))

t.start()
if lines:
line=lines.pop()
else:
continue

with open(self.dFile,‘w‘) as fp:
for i in xrange(len(self.aliveList)):
fp.write(self.aliveList[i])

def linkWithProxy(self,line):
lineList=line.split(‘\t‘)
protocol=lineList[2].lower()
server=protocol+r‘://‘+lineList[0]+‘:‘+lineList[1]
opener=urllib2.build_opener(urllib2.ProxyHandler({protocol:server}))
urllib2.install_opener(opener)
try:
response=urllib2.urlopen(self.URL,timeout=self.timeout)
except:
print(‘%s connect failed‘ %server)
return
else:
try:
str=response.read()
except:
print(‘%s connect failed‘ %server)
return
if self.regex.search(str):
print(‘%s connect success ............‘ %server)
self.aliveList.append(line)


if __name__ == ‘__main__‘:
TP=TesyProxy()


执行命令:python testProxy.py
结果:

技术分享

 


 

2017.08.05 Python网络爬虫实战之获取代理