第一篇技术博客,记录自己渣渣的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版权协议,转载请附上原文出处链接和本声明。