爬网站的时候,由于各种原因,ip被锁了,这个时候我们就需要通过代理来突破封锁。网上有很多代理网站,付费和免费的都有,这次我们就来写一个scrapy爬虫,爬一些免费的代理下来用。

目标分析:

本次爬取了代理网站:

目标很简单,从网上爬下ip地址和端口,保存在本地文件中

数据筛选:

相信写了这么多个demo,大家对于从html文件中定位元素位置都不陌生了吧?

我这里就不写具体是怎么抓的了,大家可以用自己的喜欢的方法,

无论是Xpath还是CSS选贼器,或者是我们原来用的最顺手的bs4

如果还是无从下手,可以回头看看我bs4爬虫的教程,看看我是如何做的

其实最重要的就是两点:掌握选择器语法

熟练使用chrome开发工具

要是还是一点头绪都没有,可以之间看我下面实现的代码。

项目的创建:

这一部分很简单,就是套路东西,我也不详细说啦,

跟着代码来就行:

# 创建项目

scrapy startproject proxy

# c进入项目文件夹

cd proxy

# 创建xici代理爬虫

scrapy genspider dxdlspider xicidaili.com

# 创建快代理爬虫

scray genspider kdlspider kuaidaili.com

# 看看目录长啥样

.

├── proxy

│ ├── __init__.py

│ ├── __pycache__

│ │ ├── __init__.cpython-36.pyc

│ │ ├── items.cpython-36.pyc

│ │ ├── pipelines.cpython-36.pyc

│ │ └── settings.cpython-36.pyc

│ ├── items.py

│ ├── middlewares.py

│ ├── pipelines.py

│ ├── settings.py

│ └── spiders

│ ├── __init__.py

│ ├── __pycache__

│ │ ├── __init__.cpython-36.pyc

│ │ ├── dxdlspider.cpython-36.pyc

│ │ └── kdlspider.cpython-36.pyc

│ ├── dxdlspider.py

│ └── kdlspider.py

└── scrapy.cfg

4 directories, 16 files

items的编写:

由于我们只需要代理的端口和ip,网页上其他花里胡哨的东西都不要,

所以items编写起来异常的简单:

import scrapy

class ProxyItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

#这个爬虫十分简单,我们要ip+端口,所以一个字段就够用了!

addr = scrapy.Field()

Spider的编写:

我又要来唠叨了,这个部分还是我们scrapy框架中的核心部分!

虽然在这个例子里非常的简单:

编写大象代理的Spider:

在编写这个Spider的时候,我吃惊的发现,该站张居然提供了代理的api

api:http://api.xicidaili.com/free2016.txt

这也就意味着,我们不用辛苦的写代码筛选数据了,

但是我们已经把爬虫建立了,总不能删了吧?那多难受!

这个简单,我们把Response.text的内容传给item

好! 就这样做:

import scrapy

from proxy.items import ProxyItem

class DxdlspiderSpider(scrapy.Spider):

name = "dxdlspider"

allowed_domains = ["xicidaili.com"]

start_urls = ['http://api.xicidaili.com/free2016.txt']

def parse(self, response):

item = ProxyItem()

#因为直接调用网站的api,本身get下来的就是一个text文本,

#我们直接把文本传给item再交给pipeline处理就行

item['addr'] = response.text

return item

编写快代理的Spider:

这个网站就没有上一个那么好了,

我们老老实实自己爬吧:

import scrapy

from proxy.items import ProxyItem

class KdlspiderSpider(scrapy.Spider):

name = "kdlspider"

allowed_domains = ["kuaidaili.com"]

start_urls = []

# 通过简单的循环,来生成爬取页面的列表

# 这里我们爬1~5页

for i in range(1, 6):

start_urls.append('http://www.kuaidaili.com/free/inha/' + str(i) + '/')

def parse(self, response):

# 我们先实例化一个item

item = ProxyItem()

# 通过Xpath找到每条代理的内容

mian = response.xpath(

'//table[@class="table table-bordered table-striped"]/tbody/tr')

for li in mian:

#找到ip地址

ip = li.xpath('td/text()').extract()[0]

#找到端口:

port =li.xpath('td/text()').extract()[1]

#将两者连接,并返回给item处理

item['addr'] = ip+':'+port

yield item

PIPELINE的编写:

最核心和最难的爬虫部分写完了,剩下的就是收尾工作,

我们来写个PIPELINE来爬到的数据写入本地。

但是这里需要注意一下,

我们这里有两个Spider,都会往pipeline里传item

那么我们怎么分别处理呢?

我查阅了一下文档,发现并没有什么特别好的解决方式,

所以我就在pipeline里自己做了一个判断,

看代码吧:

class ProxyPipeline(object):

'''这里我们通过对spider name的判断来分清楚item是哪一个spider传来的从而做出不同的处理方式'''

def process_item(self, item, spider):

if spider.name == 'dxdlspider':

content = item['addr'].split('\r\n')

for line in content:

open('/Users/ehco/Desktop/result/dx_proxy.txt','a').write(line+'\n')

elif spider.name=='kdlspider':

#我们直接将传来的addr写入文本

open('/Users/ehco/Desktop/result/kdl_proxy.txt','a').write(item['addr']+'\n')

return item

测试一下:

啥? 为啥报错了?

这两个网站都不存在登录,

所以就不是cookie的问题

那么问题出在哪呢?

经过我仔细周密的检查,

我发现,原来是快代理有反爬虫机制:

请求过于频繁的时候,禁止访问!

上有政策,下有对策,

我们来设置一下载延迟:

DOWNLOAD_DELAY = 1

编写配置文件Settings:

BOT_NAME = 'proxy'

SPIDER_MODULES = ['proxy.spiders']

NEWSPIDER_MODULE = 'proxy.spiders'

ROBOTSTXT_OBEY = True

# 设置下载延迟,避免被封锁

DOWNLOAD_DELAY = 1

ITEM_PIPELINES = {

'proxy.pipelines.ProxyPipeline': 300,

}

到这里,我们的功能就完全写好了

代理爬到了,

剩下的就是筛选工作了。

筛选无用代理:

网上充斥着大量的代理,但

无论是免费的还是付费的其实质量都很堪忧,

所以虽然我们从网上将代理爬了下来,

如何保证这些代理都是好用的呢?

本来我们可以把验证的过程写在PIPELINE里,

可是验证一个代理有效性的时机间,

比把数据写到本地长了十几倍,

所以我决定写一个脚本来筛选代理。

这个脚本会用到一点多线程的知识,

说实在的,Python对于多线程和多进程的支持有点差

原来我也从来没有这方面的需求,所以就一直没在意这方面

这次用到了,我也是仔细学习了一下,

不多说了,看代码吧:

'''我们通过这个小脚本来判断抓取到的ip代理是否可以用!还是通过我最熟悉的request库来实现不过这里稍微加一下我也不太熟悉的多线程'''

import requests

# 引入这个库来获得map函数的并发版本

from multiprocessing.dummy import Pool as ThreadPool

# 定义全局变量

dir_path = '/Users/ehco/Desktop/result/'

alive_ip = []

# 使得map并发!实例化pool对象

pool = ThreadPool()

# 设置并发数量!

pool = ThreadPool(20)

def test_alive(proxy):

'''一个简单的函数,来判断通过代理访问百度筛选通过的代理保存到alive_ip中'''

global alive_ip

#设置代理头

proxies = {'http': proxy}

print('正在测试:{}'.format(proxies))

try:

r = requests.get('http://www.baidu.com', proxies=proxies, timeout=3)

if r.status_code == 200:

print('该代理:{}成功存活'.format(proxy))

alive_ip.append(proxy)

except:

print('该代理{}失效!'.format(proxies))

def Out_file(alive_ip=[]):

'''将符合要求的代理写入文件'''

global dir_path

with open(dir_path + 'alive_ip.txt', 'a+') as f:

for ip in alive_ip:

f.write(ip + '\n')

print('所有存活ip都已经写入文件!')

def test(filename='blank.txt'):

# 循环处理每行文件

with open(dir_path + filename, 'r') as f:

lines = f.readlines()

# 我们去掉lines每一项后面的\n\r之类的空格

# 生成一个新的列表!

proxys = list(map(lambda x: x.strip(), [y for y in lines]))

#一行代码解决多线程!

pool.map(test_alive,proxys)

# 将存活的ip写入文件

Out_file(alive_ip)

#调用函数!

test('1.txt')

代理爬取结果:

因为还没到用代理的时候,我先爬取少量的:

筛选结果展示:

一共爬下来快200个,

能用的就这么点,可怜吧~

这几天我不是消失了,实在是比较忙,期末到了,各种大作业(ㄒoㄒ) 加上突发奇想,想把妹子图全站趴下来,就又浪费了一点时间。但是放心,我不会烂尾的 逃~

先放两张我爬妹子图的成果:

一共3347个图包,打包一共10g

想要资源的同学关注一下

公众号:findyourownway

回复: 妹纸图

公众号里还有免费分享的ss线路,

习惯在Google查资料的小伙伴也可以关注一波!

每天的学习记录都会 同步更新到:

微信公众号: findyourownway

知乎专栏:从零开始写Python爬虫 - 知乎专栏

blog : www.ehcoblog.ml

Github: Ehco1996/Python-crawler

python爬虫代理的使用_从零开始写Python爬虫 --- 2.4 爬虫实践:代理的爬取和验证...相关推荐

  1. python 小说爬虫_从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载

    从零开始写Python爬虫 --- 1.7 爬虫实践: 排行榜小说批量下载Ehco 5 个月前 本来只是准备做一个爬起点小说名字的爬虫,后来想了一下,为啥不顺便把小说的内容也爬下来呢?于是我就写了这个 ...

  2. python爬取知乎评论_从零开始写Python爬虫 --- 爬虫应用:IT之家热门段子(评论)爬取...

    不知道这里有没有喜欢刷it之家的小伙伴,我反正每天早上醒来第一件事就是打开it之家,看看有没有新鲜的段子 逃~ 其实这次是要来抓取it之家的热门评论,因为数量较多(上万),所以我们这次采用MongoD ...

  3. python实现素数筛选法_从零开始学Python系列-第6讲:循环结构

    应用场景 我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景.例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令.在这个场景 ...

  4. python 窗口程序开发课程_从零开始学Python - 第019课:使用PyCharm开发Python应用程序...

    坚持学习完前18课的小伙伴应该已经感受到了,随着我们对Python语言的认知在逐步加深,我们写的代码也越来越复杂了."工欲善其事,必先利其器",如果希望能够更快更好的写出代码,选择 ...

  5. 不是python文件操作的相关函数_从零开始学Python(七):文件存储I/O流和异常捕捉

    这两天在搞小程序开发,耽搁了一下更新的进度,今天补上.一个完整的前端程序肯定离不开数据存储和网络两个模块,今天我们就先来讲讲python中的一种常见数据存储:文件存储!~! 文件存储(I/O操作) 何 ...

  6. python爬斗鱼直播_从零开始写Python爬虫 --- 爬虫应用: 利用斗鱼Api抓取弹幕

    七月末的南京简直开启了「微波炉」模式,白天要学车的我,晚上自然选择宅在家看直播,看着狗贼叔叔满屏幕的弹幕,我就想着能不能把弹幕爬下来呢?说干就干 结果的展示: 这里只抓到弹幕内容和发送用户 并输出在终 ...

  7. python重复元素判定编程_从零开始学Python编程四:条件判断与循环

    前面已经介绍了不少Python基础知识,大家不要觉得不耐烦,想要学好Python,做好Python开发,一定要打牢基础.大家也发现了,Python中很多基础知识和数学算法是一样的,比如今天要教给大家的 ...

  8. python函数模块关键代码_从零开始学Python(六):函数,模块和类的使用

    从这章开始,我们不在使用sublime文本编译器进行编码了,主要是我们每次运行的使用还得去命令行执行pyhon ***.py命令查看结果,操作比较麻烦.推荐大家使用Pycharm(具体安装使用教程大家 ...

  9. python 方差膨胀因子 检验_从零开始学Python【22】--线性回归诊断(第一部分)

    往期回顾 前言 在上一期中,关于线性回归模型的创建,我们对比了Python和R语言的具体代码实现,受到了很多网友的关注.也有一些朋友问到,关于线性回归模型的那些前提假设为什么没有作分享,这期和下期我们 ...

最新文章

  1. 对tomcat服务的***演示与安全分析
  2. 博客已经迁移至 http://barretlee.com/entry/,时而同步分享到这里
  3. 出现could not find developer disk image解决办法和不受信任的开发者
  4. 基于DEAP库的python进化算法-3.简单遗传算法的实现
  5. 【译】Simple MySQL ORM for C
  6. vmware linux ssh密码,从 CLI 重置 Linux VM 密码和 SSH 密钥 - Azure Virtual Machines | Microsoft Docs...
  7. testbed 桩函数设置
  8. 【LeetCode/力扣】1723. 完成所有工作的最短时间
  9. 讯飞AIUI智能机器人2
  10. Python 3 《array》入门练习
  11. Unity各个坐标轴
  12. 【七夕特别篇】七夕已至,让爱闪耀
  13. 短信导出工具V1.3
  14. linux 下安装mysql相关笔记
  15. mpvue框架开发小程序
  16. 《中国人史纲》读书笔记:第四章 半信史时代 第五章 信史时代
  17. 精确拐点交易体系之追涨停策略
  18. 4个参数搞定ABTEST样本量的最优选择
  19. sizeof的用法详解
  20. 噪声与振动控制工程手册_强夯施工振动安全距离研究总结说明

热门文章

  1. Ubuntu16.04安装gazebo8并加载模型库
  2. 第十一次作业 - Alpha 事后诸葛亮(团队)
  3. Lambda 表达式
  4. 梧桐树金玉满堂增额终身寿险将下架,百度开屏也懂我的资产荒焦虑
  5. 使用WindowsLiveWriter发布51cto博客
  6. php多线程采集,php浏览器模拟:用于多线程处理的curl_multi一族函数使用介绍
  7. uni-app小程序,将base64图片保存到本地相册
  8. 房屋征收拆迁信息化管理平台
  9. linux的vps主机安装图形界面并远程访问
  10. CIO40: 2020年IT人员如何借机破局