Python代理IP爬虫的新手使用教程


Posted in Python onSeptember 05, 2019

前言

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

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

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

问题

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

Python代理IP爬虫的新手使用教程

思路:

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

  1. 爬取一些IP,过滤掉不可用.
  2. 在requests的请求的proxies参数加入对应的IP.
  3. 继续爬取.
  4. 收工
  5. 好吧,都是废话,理论大家都懂,上面直接上代码...

思路有了,动手起来.

运行环境

Python 3.7, Pycharm

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

准备工作

  1. 爬取IP地址的网站(国内高匿代理)
  2. 校验IP地址的网站
  3. 你之前被封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 = '书名:<%s>' % 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)

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

Python代理IP爬虫的新手使用教程

总结

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

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

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

Python 相关文章推荐
Python os模块学习笔记
Jun 21 Python
Python创建xml文件示例
Mar 22 Python
Python基于回溯法子集树模板解决m着色问题示例
Sep 07 Python
Pycharm在创建py文件时,自动添加文件头注释的实例
May 07 Python
python使用Matplotlib画条形图
Mar 25 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
python如何制作缩略图
Apr 30 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
Python jieba结巴分词原理及用法解析
Nov 05 Python
用Python制作灯光秀短视频的思路详解
Apr 13 Python
python入门学习关于for else的特殊特性讲解
Nov 20 Python
关于Python内存分配时的小秘密分享
Sep 05 #Python
python global关键字的用法详解
Sep 05 #Python
python requests证书问题解决
Sep 05 #Python
Python使用scipy模块实现一维卷积运算示例
Sep 05 #Python
Python图像处理模块ndimage用法实例分析
Sep 05 #Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
Sep 05 #Python
PyCharm搭建Spark开发环境的实现步骤
Sep 05 #Python
You might like
PHP调用三种数据库的方法(1)
2006/10/09 PHP
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
Laravel 5框架学习之向视图传送数据(进阶篇)
2015/04/08 PHP
PHP反射实际应用示例
2019/04/03 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
Ucren Virtual Desktop V2.0
2006/11/07 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
JavaScript中的面向对象介绍
2012/06/30 Javascript
JQuery EasyUI 数字格式化处理示例
2014/05/05 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
2020/10/24 Javascript
Javascript实现关闭广告效果
2021/01/29 Javascript
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python列表生成器的循环技巧分享
2015/03/06 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
python中对数据进行各种排序的方法
2019/07/02 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
python+adb命令实现自动刷视频脚本案例
2020/04/23 Python
基于django micro搭建网站实现加水印功能
2020/05/22 Python
CSS3 实现的缩略图悬停效果
2020/12/09 HTML / CSS
咨询公司各岗位职责
2013/12/02 职场文书
采购主管岗位职责
2014/02/01 职场文书
英语复习计划
2015/01/19 职场文书
运动会开幕词
2015/01/28 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
2021/04/06 Python
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
Win11安装升级时提示“该电脑必须支持安全启动”
2022/04/19 数码科技
Golang解析JSON对象
2022/04/30 Golang