Python中Scrapy框架的代理使用

时间:2022-10-08 16:13:13

本文中所涉及的网站皆以GG代替。

scrapy框架,熟悉python爬虫的朋友们应该知道甚至有所了解,scrapy是一个爬虫框架,模块化程度高,可拓展性强,对相应的模块进行开发和拓展就能满足使用者想要得到的效果。

所以本次我就简单介绍下scrapy的使用和代理的配置。

一、scrapy的配置

说是配置,其实scrapy也没啥可配置的,因为他新建项目真的很简单,再你想要创建项目的目录下输入或者打开cmd输入:

scrapy startproject mySpider(你想要的项目名)

但是前提是,你得需要pip安装scrapy:

pip install scrapy

当你pip安装好scrapy并且部署好scrapy项目之后,最基础的东西就搭建好了。

二、scrapy的使用

还是先看一下scrapy的目录结构吧家人们。

首先我先创建了一个叫做 scrapytest 的项目,目录结构如下:

Python中Scrapy框架的代理使用

Python中Scrapy框架的代理使用

从外到内,scrapy.cfg 是scrapy项目的配置文件。items.py定义数据结构,规定了你想存什么样的数据和数据类型。pipelines.py 正如其名管道文件,产生的数据类型再次做数据处理。setting.py 全局设置。 middlewares.py 中间件。spiders 自定爬虫规则。

首先创建一个spider:

scrapy genspider GGSpider GG.com

输入指令后会自动帮你创建一个spider文件:

Python中Scrapy框架的代理使用

查看里面的元素,name代表此项目的名字,allowed_domains 标识允许爬取的域名并过滤非此域名的链接,start_urls 待爬取url。

修改一下start_urls里面的链接,把http改成https后,新建一个方法,开始进行爬取:

1. def start_requests(self):  
2. for url in self.starturl:
3. GGHeaders = {
4. "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
5. "authority": "www.GG.com",
6. "user-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36",
7. }
8. yield scrapy.Request(url,headers=googleHeaders)

加入不加这个方法的话,scrapy就会根据默认的流程,对start_urls的链接进行请求下载执行,将返回值传给parse函数,parse负责解析处理请求内容。

但是加入了新的方法之后,可以添加请求头,也可以不在中间件设置代理,然后执行请求将请求结果迭代给parse函数。

1. import scrapy  
2.
3. class TestSpider(scrapy.Spider):
4. name = 'GGSpider'
5. allowed_domains = ['GG.com']
6. start_urls = ['https://GG.com/']
7.
8. def start_requests(self):
9. for url in self.starturl:
10. googleHeaders = {
11. "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
12. "authority": "www.GG.com",
13. "user-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36",
14. }
15. yield scrapy.Request(url,headers=googleHeaders)
16.
17. def parse(self, response):
18. print(response.text)

执行刚才编写好的spider:

scrapy crawl googleSpider

这个googleSpider就是刚才项目中的name,结果如下:

Python中Scrapy框架的代理使用

很显然,谷歌当然没法正常访问的,之后就引出下一个部分,scrapy使用代理。

三、Scrapy代理设置

scrapy添加代理访问有两种方式,一个是在中间件设置代理,第二个就是在spider中请求前添加代理。比较适合账户认证的代理方式。

3.1 中间件添加代理

首先在中间件middlewares.py中,在最后加入如下代码:

1. class ProxyMiddleware(object):  
2. def process_request(self,request,spider):
3. entry = 'http://{}:{}@{}:{}'.format("账户", "密码","host","port")
4. request.meta["proxy"] = entry

然后在setting.py中设置优先级:

1. DOWNLOADER_MIDDLEWARES = {  
2. '你的项目名.middlewares.ProxyMiddleware': 100,
3. }

3.2 spider中设置代理

1. import scrapy  
2.
3. class TestSpider(scrapy.Spider):
4. name = 'GGSpider'
5. allowed_domains = ['GG.com']
6. start_urls = ['https://GG.com/']
7.
8. def start_requests(self):
9. # 账密:
10. # 账密链接赋值给变量
11. entry = 'http://{}-zone-custom:{}@proxy.ipidea.io:2334'.format("帐号", "密码")
12. # api
13. # entry = 'http://{}'.format("api获取的ip代理")
14. # 传参meta迭代下一个方法
15. for url in self.starturl:
16. googleHeaders = {
17. "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
18. "authority": "www.GG.com",
19. "user-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36",
20. }
21. yield scrapy.Request(url,headers=GGHeaders,meta={"proxy":entry})
22.
23. def parse(self, response):
24. print(response.text)

我这里使用的是ipidea的代理,好的代理能帮助你更好的获取数据,高质量低延迟,而且新用户可以白嫖哦!

地址:http://www.ipidea.net

如果你要是访问GG的话,访问的过于频繁会出现429警告,建议不要高频访问,适当慢一点。