爬虫篇之IP被限制的方法

第一篇技术博客,记录自己渣渣的coding。在互联网公司的实习中,发现有些工作会相互重叠,但每写一次代码,都要重新百度一次,时间效率低下,记录在博客日后好温故而知新。

 

维护自己的IP池,并验证此IP能不能用,保存到csv文件当中。

缺点:由于爬取的是西刺代理IP,每个IP时间有限,很容易过期。

import requests
import re
import time
import random
from bs4 import BeautifulSoup
import pandas as pd
keys = [
'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19',
'Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30',
'Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',
'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0',
'Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0',
'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36',
'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19',
'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3',
'Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3'
]
def get_ip_list(k):
    ip_list = []
    print("正在获取代理列表...")
    for i in range(1,k+1):
        try:
            url = 'http://www.xicidaili.com/nn/' + str(i)
            header = {'User-Agent': keys[random.randint(0, len(keys) - 1)]}
            html = requests.get(url=url, headers=header).text
            soup = BeautifulSoup(html, 'lxml')
            ips = soup.find(id='ip_list').find_all('tr')
            for j in range(1, len(ips)):
                ip_info = ips[j]
                tds = ip_info.find_all('td')
                ip = tds[1].text + ':' + tds[2].text
                # 用这个网页去验证,遇到不可用ip会抛异常
            url = "https://www.baidu.com/"
            try:
                proxies = {'http': 'http://' + ip}
                res = requests.get(url, headers=header, proxies=proxies).text
                ip_list.append('http://' + ip)
            except Exception as e:
                print (e)
                continue
            print("第{}页代理列表抓取成功.".format(i))
            time.sleep(5 + float(random.randint(1,100)) /20)
        except Exception as e:
            print('error:',e)
    return ip_list

ip_list = get_ip_list(100)

pd.DataFrame(columns = ['ip'], data = ip_list).to_csv('ip_list_1.csv',encoding='utf-8',index = False)
print('一共获得{}个IP地址'.format(len(ip_list)))

IP被限制采取的方法

如果需要爬取的数据量比较大的话,而且还可能遇到大规模爬虫IP被网站封禁的情况,因为好的网站会有反爬虫策略。多线程和分布式爬虫、 IP代理、处理验证码、模拟登陆、内置浏览器引擎爬虫,

 

  • 对爬虫抓取进行压力控制;可以考虑使用代理的方式访问目标站点。
    proxy_list = list(pd.read_csv('ip_list.csv')['ip']) 
    spider_header = list(pd.read_csv('spider_header_list.csv')['header']) 
    proxy = random.choice(proxy_list) 
    header = random.choice(spider_header) 
    urlhandle = urllib.request.ProxyHandler({'http': proxy}) 
    opener = urllib.request.build_opener(urlhandle) 
    urllib.request.install_opener(opener) 
    req = urllib.request.Request(url) 
    req.add_header('User-Agent', header) 
    author_poem = [] 
    response_result = urllib.request.urlopen(req).read() 
    html = response_result.decode('utf-8') 
    html = etree.HTML(html)

  • 降低抓取频率,时间设置长一些,访问时间采用随机数
  • 频繁切换UserAgent(模拟浏览器访问)。不同浏览器的不同版本都有不同的user_agent,是浏览器类型的详细信息,也是浏览器提交Http请求的重要头部信息。我们可以在每次请求的时候提供不同的user_agent,绕过网站检测客户端的反爬虫机制。比如说,可以把很多的user_agent放在一个列表中,每次随机选一个用于提交访问请求。
  • 多页面数据,随机访问然后抓取数据 -更换用户IP

版权声明:本文为l_u_h_a_i原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。