代理ip

代理ip

爬虫必要用代理IP吗?

采集交流优采云 发表了文章 • 0 个评论 • 211 次浏览 • 2020-07-05 08:00 • 来自相关话题

  
  不用代理也是可以的,爬虫程序从本质上来说也是个访问网页的用户而已,只不过是个不这么守规矩的特殊用户,服务器通常太不欢迎这样的特殊用户总是用各类手段发觉和严禁。最常见的就是判定你访问的频度,因为普通人访问网页的频度是不会很快的,如果发觉某个ip访问的过快才会将此ip封禁。当然你可以选择采取减少访问频度的方式防止被服务器发觉,但是假如你的爬虫和一个普通人访问的频度差不多访问逻辑也差不多的话,那么你的爬虫也就没多大的存在意义了。做爬虫都希望自己的爬虫尽早的抓取大量的数据,而且还要常常频繁的更新数据,当然有节操的爬虫都晓得将爬取频度设在一个合理的范围增加目标服务器的压力而不是犯傻爬的飞快,要知道爬与反爬没有绝对的有效手段,它们之间常常保持着微妙的默契,不会赶尽杀绝,而且你爬他人,别人也会爬你是不,出来混迟早要还的,不过这是另一个层面的东西了。更常用的手段是使用代理ip,突破服务器的反爬虫机制,继续较高频度的抓取。有一个思路是我们的adsl拨号通常断线重拨后会得到一个新的ip,我们可以在一段时间后就重新联接adsl获取新的ip再继续爬取,但是有个问题拔号重拨必须要间隔一段时间才可以,这样我们的程序就中断了,所以你可以打算几台adsl的服务器作为代理爬虫代理软件,然后爬虫运行在另外一台不断网的服务器运行爬虫代理软件,当然这样使用对于大数据爬取来说就太麻烦了,于是就有了好多第三方的专业代理商,你可以通过她们便捷快捷的获取大量的ip使用,同时通常好点的代理商都会针对爬虫等常见业务做策略优化,使你被封的机率更低,如果你是大量数据的爬虫使用者,使用代理ip基本就是必备的手段了。 查看全部

  
  不用代理也是可以的,爬虫程序从本质上来说也是个访问网页的用户而已,只不过是个不这么守规矩的特殊用户,服务器通常太不欢迎这样的特殊用户总是用各类手段发觉和严禁。最常见的就是判定你访问的频度,因为普通人访问网页的频度是不会很快的,如果发觉某个ip访问的过快才会将此ip封禁。当然你可以选择采取减少访问频度的方式防止被服务器发觉,但是假如你的爬虫和一个普通人访问的频度差不多访问逻辑也差不多的话,那么你的爬虫也就没多大的存在意义了。做爬虫都希望自己的爬虫尽早的抓取大量的数据,而且还要常常频繁的更新数据,当然有节操的爬虫都晓得将爬取频度设在一个合理的范围增加目标服务器的压力而不是犯傻爬的飞快,要知道爬与反爬没有绝对的有效手段,它们之间常常保持着微妙的默契,不会赶尽杀绝,而且你爬他人,别人也会爬你是不,出来混迟早要还的,不过这是另一个层面的东西了。更常用的手段是使用代理ip,突破服务器的反爬虫机制,继续较高频度的抓取。有一个思路是我们的adsl拨号通常断线重拨后会得到一个新的ip,我们可以在一段时间后就重新联接adsl获取新的ip再继续爬取,但是有个问题拔号重拨必须要间隔一段时间才可以,这样我们的程序就中断了,所以你可以打算几台adsl的服务器作为代理爬虫代理软件,然后爬虫运行在另外一台不断网的服务器运行爬虫代理软件,当然这样使用对于大数据爬取来说就太麻烦了,于是就有了好多第三方的专业代理商,你可以通过她们便捷快捷的获取大量的ip使用,同时通常好点的代理商都会针对爬虫等常见业务做策略优化,使你被封的机率更低,如果你是大量数据的爬虫使用者,使用代理ip基本就是必备的手段了。

Python代理IP爬虫的菜鸟使用教程

采集交流优采云 发表了文章 • 0 个评论 • 308 次浏览 • 2020-06-24 08:01 • 来自相关话题

  前言
  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 = '书名:<%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)
  为什么选择国外高匿代理!
  
  总结
  使用这样简单的代理IP,基本上就可以应付在爬爬爬着被封IP的情况了.而且没有使用自己的IP,间接的保护?!?!
  大家有其他的愈发快捷的方式,欢迎你们可以拿出来交流和讨论爬虫代理,谢谢。 查看全部

  前言
  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 = '书名:<%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)
  为什么选择国外高匿代理!
  
  总结
  使用这样简单的代理IP,基本上就可以应付在爬爬爬着被封IP的情况了.而且没有使用自己的IP,间接的保护?!?!
  大家有其他的愈发快捷的方式,欢迎你们可以拿出来交流和讨论爬虫代理,谢谢。

爬虫必要用代理IP吗?

采集交流优采云 发表了文章 • 0 个评论 • 211 次浏览 • 2020-07-05 08:00 • 来自相关话题

  
  不用代理也是可以的,爬虫程序从本质上来说也是个访问网页的用户而已,只不过是个不这么守规矩的特殊用户,服务器通常太不欢迎这样的特殊用户总是用各类手段发觉和严禁。最常见的就是判定你访问的频度,因为普通人访问网页的频度是不会很快的,如果发觉某个ip访问的过快才会将此ip封禁。当然你可以选择采取减少访问频度的方式防止被服务器发觉,但是假如你的爬虫和一个普通人访问的频度差不多访问逻辑也差不多的话,那么你的爬虫也就没多大的存在意义了。做爬虫都希望自己的爬虫尽早的抓取大量的数据,而且还要常常频繁的更新数据,当然有节操的爬虫都晓得将爬取频度设在一个合理的范围增加目标服务器的压力而不是犯傻爬的飞快,要知道爬与反爬没有绝对的有效手段,它们之间常常保持着微妙的默契,不会赶尽杀绝,而且你爬他人,别人也会爬你是不,出来混迟早要还的,不过这是另一个层面的东西了。更常用的手段是使用代理ip,突破服务器的反爬虫机制,继续较高频度的抓取。有一个思路是我们的adsl拨号通常断线重拨后会得到一个新的ip,我们可以在一段时间后就重新联接adsl获取新的ip再继续爬取,但是有个问题拔号重拨必须要间隔一段时间才可以,这样我们的程序就中断了,所以你可以打算几台adsl的服务器作为代理爬虫代理软件,然后爬虫运行在另外一台不断网的服务器运行爬虫代理软件,当然这样使用对于大数据爬取来说就太麻烦了,于是就有了好多第三方的专业代理商,你可以通过她们便捷快捷的获取大量的ip使用,同时通常好点的代理商都会针对爬虫等常见业务做策略优化,使你被封的机率更低,如果你是大量数据的爬虫使用者,使用代理ip基本就是必备的手段了。 查看全部

  
  不用代理也是可以的,爬虫程序从本质上来说也是个访问网页的用户而已,只不过是个不这么守规矩的特殊用户,服务器通常太不欢迎这样的特殊用户总是用各类手段发觉和严禁。最常见的就是判定你访问的频度,因为普通人访问网页的频度是不会很快的,如果发觉某个ip访问的过快才会将此ip封禁。当然你可以选择采取减少访问频度的方式防止被服务器发觉,但是假如你的爬虫和一个普通人访问的频度差不多访问逻辑也差不多的话,那么你的爬虫也就没多大的存在意义了。做爬虫都希望自己的爬虫尽早的抓取大量的数据,而且还要常常频繁的更新数据,当然有节操的爬虫都晓得将爬取频度设在一个合理的范围增加目标服务器的压力而不是犯傻爬的飞快,要知道爬与反爬没有绝对的有效手段,它们之间常常保持着微妙的默契,不会赶尽杀绝,而且你爬他人,别人也会爬你是不,出来混迟早要还的,不过这是另一个层面的东西了。更常用的手段是使用代理ip,突破服务器的反爬虫机制,继续较高频度的抓取。有一个思路是我们的adsl拨号通常断线重拨后会得到一个新的ip,我们可以在一段时间后就重新联接adsl获取新的ip再继续爬取,但是有个问题拔号重拨必须要间隔一段时间才可以,这样我们的程序就中断了,所以你可以打算几台adsl的服务器作为代理爬虫代理软件,然后爬虫运行在另外一台不断网的服务器运行爬虫代理软件,当然这样使用对于大数据爬取来说就太麻烦了,于是就有了好多第三方的专业代理商,你可以通过她们便捷快捷的获取大量的ip使用,同时通常好点的代理商都会针对爬虫等常见业务做策略优化,使你被封的机率更低,如果你是大量数据的爬虫使用者,使用代理ip基本就是必备的手段了。

Python代理IP爬虫的菜鸟使用教程

采集交流优采云 发表了文章 • 0 个评论 • 308 次浏览 • 2020-06-24 08:01 • 来自相关话题

  前言
  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 = '书名:<%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)
  为什么选择国外高匿代理!
  
  总结
  使用这样简单的代理IP,基本上就可以应付在爬爬爬着被封IP的情况了.而且没有使用自己的IP,间接的保护?!?!
  大家有其他的愈发快捷的方式,欢迎你们可以拿出来交流和讨论爬虫代理,谢谢。 查看全部

  前言
  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 = '书名:<%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)
  为什么选择国外高匿代理!
  
  总结
  使用这样简单的代理IP,基本上就可以应付在爬爬爬着被封IP的情况了.而且没有使用自己的IP,间接的保护?!?!
  大家有其他的愈发快捷的方式,欢迎你们可以拿出来交流和讨论爬虫代理,谢谢。

官方客服QQ群

微信人工客服

QQ人工客服


线