Python爬虫教程-使用Scrapy(2)

本文主要讲使用IP代理防止爬虫被禁

python爬虫中爬取到大约184条数据后,zhipin网站就会采取链接重定向方式 阻止爬取。如果在代码中取消登录操作 , 直接爬取到大约92条数据,你的 IP 就会被封啦~

为了防止这个悲剧发生 根据Scarpy https://doc.scrapy.org/en/latest/topics/practices.html?highlight=banned#avoiding-getting-banned 有以下几个建议:

  • 动态设置user agent
  • 禁用cookies (COOKIES_ENABLED
  • 设置延迟下载 (DOWNLOAD_DELAY
  • 使用Google cache (国内不好用)
  • 使用IP地址池(Tor project、VPN和代理IP)
  • 使用Crawlera (收费

在setting.py中设置完 COOKIES_ENABLED 和 DOWNLOAD_DELAY 下面就来看如何使用 User Agent 和 IP代理

设置 UA池和 IP池

scarpy设置代理IP 和 User Agent的切换都是用 下载中间件 DOWNLOADER_MIDDLEWARES 完成。

动态切换 User Agent

在工程中 middleware.py(没有这个文件就创建一个,若是有这个文件 里面有内置的中间件也不用理会它) 中添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import random


agents = [
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
]


class UserAgentMiddleware(object):

def process_request(self, request, spider):
agent = random.choice(agents)
request.headers["User-Agent"] = agent

然后在setting.py中 添加:

1
2
3
DOWNLOADER_MIDDLEWARES = {
'jobSpider.middlewares.UserAgentMiddleware': 401,
}

IP代理

简单来,比如本地127.0.0.1开启了一个8888端口的代理,同样可以通过中间件配置让爬虫通过这个代理来对目标网站进行爬取。
同样在middleware.py中加入:

1
2
3
4
5
6
7
class ProxyMiddleware(object):

def process_request(self, request, spider):
# 此处填写你自己的代理
# 如果是买的代理的话可以去用API获取代理列表然后随机选择一个
proxy = "http://127.0.0.1: 8888"
request.meta["proxy"] = proxy

然后和 user agent中一样 在setting.py 的DOWNLOADER_MIDDLEWARES中添加ProxyMiddleware就可以了。

但是当然用第三方的ip代理 才能达到防止爬虫被banned的目的啦~