前言

Python爬虫要经历爬虫、爬虫被限制、爬虫反限制的过程。当然后续还要网页爬虫限制优化,爬虫再反限制的一系列道高一尺魔高一丈的过程。爬虫的初级阶段,添加headers和ip代理可以解决很多问题。

本人自己在爬取豆瓣读书的时候,就以为爬取次数过多,直接被封了IP.后来就研究了代理IP的问题.

(当时不知道什么情况,差点心态就崩了...),下面给大家介绍一下我自己代理IP爬取数据的问题,请大家指出不足之处.

问题

这是我的IP被封了,一开始好好的,我还以为是我的代码问题了

思路:

从网上查找了一些关于爬虫代理IP的资料,得到下面的思路

爬取一些IP,过滤掉不可用.

在requests的请求的proxies参数加入对应的IP.

继续爬取.

收工

好吧,都是废话,理论大家都懂,上面直接上代码...

思路有了,动手起来.

运行环境

Python 3.7, Pycharm

这些需要大家直接去搭建好环境...

准备工作

爬取IP地址的网站(国内高匿代理)

校验IP地址的网站

你之前被封IP的py爬虫脚本...

上面的网址看个人的情况来选取

爬取IP的完整代码

PS:简单的使用bs4获取IP和端口号,没有啥难度,里面增加了一个过滤不可用IP的逻辑

关键地方都有注释了

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# @Time : 2018/11/22

# @Author : liangk

# @Site :

# @File : auto_archive_ios.py

# @Software: PyCharm

import requests

from bs4 import BeautifulSoup

import json

class GetIp(object):

"""抓取代理IP"""

def __init__(self):

"""初始化变量"""

self.url = 'http://www.xicidaili.com/nn/'

self.check_url = 'https://www.ip.cn/'

self.ip_list = []

@staticmethod

def get_html(url):

"""请求html页面信息"""

header = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

}

try:

request = requests.get(url=url, headers=header)

request.encoding = 'utf-8'

html = request.text

return html

except Exception as e:

return ''

def get_available_ip(self, ip_address, ip_port):

"""检测IP地址是否可用"""

header = {

'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

}

ip_url_next = '://' + ip_address + ':' + ip_port

proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}

try:

r = requests.get(self.check_url, headers=header, proxies=proxies, timeout=3)

html = r.text

except:

print('fail-%s' % ip_address)

else:

print('success-%s' % ip_address)

soup = BeautifulSoup(html, 'lxml')

div = soup.find(class_='well')

if div:

print(div.text)

ip_info = {'address': ip_address, 'port': ip_port}

self.ip_list.append(ip_info)

def main(self):

"""主方法"""

web_html = self.get_html(self.url)

soup = BeautifulSoup(web_html, 'lxml')

ip_list = soup.find(id='ip_list').find_all('tr')

for ip_info in ip_list:

td_list = ip_info.find_all('td')

if len(td_list) > 0:

ip_address = td_list[1].text

ip_port = td_list[2].text

# 检测IP地址是否有效

self.get_available_ip(ip_address, ip_port)

# 写入有效文件

with open('ip.txt', 'w') as file:

json.dump(self.ip_list, file)

print(self.ip_list)

# 程序主入口

if __name__ == '__main__':

get_ip = GetIp()

get_ip.main()

使用方法完整代码

PS: 主要是通过使用随机的IP来爬取,根据request_status来判断这个IP是否可以用.

为什么要这样判断?

主要是虽然上面经过了过滤,但是不代表在你爬取的时候是可以用的,所以还是得多做一个判断.

#!/usr/bin/env python3

# -*- coding: utf-8 -*-

# @Time : 2018/11/22

# @Author : liangk

# @Site :

# @File : get_douban_books.py

# @Software: PyCharm

from bs4 import BeautifulSoup

import datetime

import requests

import json

import random

ip_random = -1

article_tag_list = []

article_type_list = []

def get_html(url):

header = {

'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'

}

global ip_random

ip_rand, proxies = get_proxie(ip_random)

print(proxies)

try:

request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)

except:

request_status = 500

else:

request_status = request.status_code

print(request_status)

while request_status != 200:

ip_random = -1

ip_rand, proxies = get_proxie(ip_random)

print(proxies)

try:

request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)

except:

request_status = 500

else:

request_status = request.status_code

print(request_status)

ip_random = ip_rand

request.encoding = 'gbk'

html = request.content

print(html)

return html

def get_proxie(random_number):

with open('ip.txt', 'r') as file:

ip_list = json.load(file)

if random_number == -1:

random_number = random.randint(0, len(ip_list) - 1)

ip_info = ip_list[random_number]

ip_url_next = '://' + ip_info['address'] + ':' + ip_info['port']

proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}

return random_number, proxies

# 程序主入口

if __name__ == '__main__':

"""只是爬取了书籍的第一页,按照评价排序"""

start_time = datetime.datetime.now()

url = 'https://book.douban.com/tag/?view=type&icn=index-sorttags-all'

base_url = 'https://book.douban.com/tag/'

html = get_html(url)

soup = BeautifulSoup(html, 'lxml')

article_tag_list = soup.find_all(class_='tag-content-wrapper')

tagCol_list = soup.find_all(class_='tagCol')

for table in tagCol_list:

""" 整理分析数据 """

sub_type_list = []

a = table.find_all('a')

for book_type in a:

sub_type_list.append(book_type.text)

article_type_list.append(sub_type_list)

for sub in article_type_list:

for sub1 in sub:

title = '==============' + sub1 + '=============='

print(title)

print(base_url + sub1 + '?start=0' + '&type=S')

with open('book.text', 'a', encoding='utf-8') as f:

f.write('\n' + title + '\n')

f.write(url + '\n')

for start in range(0, 2):

# (start * 20) 分页是0 20 40 这样的

# type=S是按评价排序

url = base_url + sub1 + '?start=%s' % (start * 20) + '&type=S'

html = get_html(url)

soup = BeautifulSoup(html, 'lxml')

li = soup.find_all(class_='subject-item')

for div in li:

info = div.find(class_='info').find('a')

img = div.find(class_='pic').find('img')

content = '书名:' % info['title'] + ' 书本图片:' + img['src'] + '\n'

print(content)

with open('book.text', 'a', encoding='utf-8') as f:

f.write(content)

end_time = datetime.datetime.now()

print('耗时: ', (end_time - start_time).seconds)

为什么选择国内高匿代理!

总结

使用这样简单的代理IP,基本上就可以应付在爬爬爬着被封IP的情况了.而且没有使用自己的IP,间接的保护?!?!

大家有其他的更加快捷的方法,欢迎大家可以拿出来交流和讨论,谢谢。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:Python爬虫代理IP池实现方法

Python爬虫设置代理IP的方法(爬虫技巧)

Python实现爬虫设置代理IP和伪装成浏览器的方法分享

通过Python爬虫代理IP快速增加博客阅读量

Python爬虫常用小技巧之设置代理IP

selenium+python设置爬虫代理IP的方法

Python爬虫爬取新浪微博内容示例【基于代理IP】

Python3网络爬虫之使用User Agent和代理IP隐藏身份

Python爬虫抓取代理IP并检验可用性的实例

python 爬虫 批量获取代理ip的实例代码

python爬虫代理教程_Python代理IP爬虫的新手使用教程相关推荐

  1. Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python

    Python学习教程(Python学习路线_Python基础学习教程_Python视频教程):初学者新手怎样快速入门Python? 人生苦短,我用Python!!!短短几个字,现在在各大学习类平台随处 ...

  2. python爬虫面试代理池_python - 如何为爬虫构建代理池

    问 题 为了避免爬虫被封 IP ,网上搜索教程说需要建立代理池.但是付费代理都好贵...不过好在网上已经有不少免费提供代理的网站了.因此,我打算写个爬虫去获取这些免费 IP - 策略步骤 用种子关键词 ...

  3. python ip代理池_python实现ip代理池功能示例

    本文实例讲述了python实现ip代理池功能.分享给大家供大家参考,具体如下: 爬取的代理源为西刺代理. 用xpath解析页面 用telnet来验证ip是否可用 把有效的ip写入到本地txt中.当然也 ...

  4. python爬虫文本去重_Python微型异步爬虫框架

    Amipy Python微型异步爬虫框架(A micro asynchronous Python website crawler framework) 基于Python 3.5 + 的异步async- ...

  5. python简易爬虫课程设计_python实现简单爬虫功能的示例

    在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的 ...

  6. python实现简单爬虫百度首页_python实现简单爬虫功能的示例

    在我们日常上网浏览网页的时候,经常会看到一些好看的图片,我们就希望把这些图片保存下载,或者用户用来做桌面壁纸,或者用来做设计的素材. 我们最常规的做法就是通过鼠标右键,选择另存为.但有些图片鼠标右键的 ...

  7. python 百度文库 签到_Python百度文库爬虫终极版

    百度文库爬虫 我们在开始爬虫之前,首先要了解网页的信息和结构,然后获取请求的url和参数(payloads)来得到所要的数据并处理.接下来我们根据: 一.网页分析 二.爬虫编写 三.运行与结果 四.程 ...

  8. python爬虫爬图片教程_python爬去妹子网整个图片资源教程(最详细版)

    爬取妹子网的低级教程连接如下:[爬妹子网](https://blog.csdn.net/baidu_35085676/article/details/68958267) ps:只支持单个套图下载,不支 ...

  9. python爬虫小说教程_python制作小说爬虫实录

    纪念我的第一个爬虫程序,一共写了三个白天,其中有两个上午没有看,中途遇到了各种奇怪的问题,伴随着他们的解决,对于一些基本的操作也弄清楚了.果然,对于这些东西的最号的学习方式,就是在使用中学习,通过解决 ...

  10. python爬虫程序说明_Python即时网络爬虫:API说明

    API说明--下载gsExtractor内容提取器 1,接口名称 下载内容提取器 2,接口说明 如果您想编写一个网络爬虫程序,您会发现大部分时间耗费在调测网页内容提取规则上,不讲正则表达式的语法如何怪 ...

最新文章

  1. Vue中前端加密使用RSA加密下的JSEncrypt防止明文暴露
  2. phpcms漏洞总结
  3. spark 笔记 1: 如何着手
  4. LeetCode 637 二叉树的层平均值-简单
  5. linux充当防火墙,Linux下主机充当防火墙的巧妙应用之iptables!.doc
  6. 可能存在无限递归_Python之递归函数
  7. 500份IT数字化转型资料,限量领!堪称最全,领不到会发慌
  8. Python---copy()、deepcopy()与赋值的区别
  9. QT 5 初学1 多窗口切分-续
  10. 【劲峰论道时空分析技术-学习笔记】5 时空格局和异常探测
  11. chrome 通过插件来监控zabbix
  12. 优先级继承 linux,非独占锁的优先级继承协议及其在Linux下的实现
  13. 学习自动驾驶的路径是什么?这份技能图谱告诉你
  14. php mysql社工库_社工库源码 PHP ASP,持续更新
  15. 超实用的工具、素材、学习网站分享
  16. vmware使用教程
  17. HTML5珠子走出迷宫小游戏代码
  18. java ffmpeg m3u8合片_FFmpeg MP4视频切片成TS m3u8播放系列
  19. WIFI共享大师无法开启发射功能
  20. 求职:本人从事3年工作流引擎开发,熟悉XPDL,.net3.5中WF,Biztalk,开源工作流引擎OBE,期望工作地点上海...

热门文章

  1. 百度网盘mac损害计算机,百度网盘Mac版
  2. CCNA考试题库中英文翻译版及答案10
  3. ajax中GET和POST区别
  4. 编译龙芯PMON流程
  5. 6个最值得Down的社交网络图标矢量素材集
  6. 「Java代码审计」Java代码审计基础知识「一」
  7. pygame教程笔记
  8. 组策略设置计算机计划任务,windows 2008 server 域环境通过组策略下发计划任务
  9. 微信小程序_for循环
  10. 步进电机正反转实验_电机正反转控制电路图原理图解