反爬虫的方式有:不返回网页、返回数据非目标网页、增加获取数据的难度。
那该如何“反反爬虫”呢?
使用python的fake-useragent库,切换User-Agent,每次生成不一样的伪装请求头。
from fake_useragent import UserAgent
import requests
link = 'http://www.santostang.com'
ua = UserAgent()
headers={"User-Agent":ua.random} #ua.random随机变换headers
response=requests.get(url=link,headers = headers)
#响应状态信息
print(response.status_code)
print(r.request.headers)
当在运行爬虫程序时,可以设置两次访问之间有一定的时间间隔,且时间间隔是随机生成,来避免反爬虫。使用time库在爬虫访问前休息一定时间。
import requests
from bs4 import BeautifulSoup
import time
import random
link = "http://www.santostang.com/"
def scrap(link):
headers = {'User-Agent':'Mozila/5.0 (Windows;U;Windows NT6.1;en-US;rv:1.9.1.6) Gecko/20091202 Firefox/3.5.6'}
r = requests.get(link,headers)
html = r.text
soup = BeautifulSoup(html,'lxml')
return soup
soup = scrap(link)
title_list = soup.find_all("h1",class_="post-title")
scrap_time = 0
for eachone in title_list:
url = eachone.a["href"]
print("开始爬取这篇博客:",url)
soup_article = scrap(url)
title = soup_article.find("h1",class_="view-title").text.strip()
print("这篇博客的标题为:",title)
sleep_time = random.randint(0,2)+random.random()
scrap_time += 1
if scrap_time % 5 == 0:
sleep_time = 10 +random.random()
else:
sleep_time = random.randint(0,2) + random.random() #random.randint(0,2)结果是0、1、2,random.random()是0-1的随机数
print("开始休息:",sleep_time,"秒")
time.sleep(sleep_time)
网站会通过IP访问量来反爬虫,因此在爬虫时可更换IP地址来防止反爬虫。更换IP地址主要有两种方法:一是通过动态IP拨号服务器更换IP;二是通过Tor代理服务器的方法。
代理是一种特殊的网站服务,即允许一个网络终端通过这个服务与另一个网络终端进行非之间的连接。代理IP池可以让爬虫程序隐藏自己的真实IP,但是维护起来很麻烦,也很不稳定。