Я написал скрипт в scrapy
, чтобы делать прокси-запросы с использованием вновь сгенерированных прокси методом get_proxies()
. Я использовал requests
модуль для извлечения прокси для повторного их использования в скрипте. Я пытаюсь разобрать все ссылки на фильмы с его целевой страницы , а затем извлечь название каждого фильма с его целевой страницы . Мой следующий скрипт может использовать ротацию прокси.
Я знаю, что есть более простой способ смены прокси, как описано здесь HttpProxyMiddleware но я все равно хотел бы придерживаться того, что я пытаюсь здесь.
ссылка на сайт
Это моя текущая попытка (она продолжает использовать новые прокси для получения правильного ответа, но каждый раз, когда получает 503 Service Unavailable
):
import scrapy
import random
import requests
from itertools import cycle
from bs4 import BeautifulSoup
from scrapy.crawler import CrawlerProcess
def get_proxies():
response = requests.get("https://www.us-proxy.org/")
soup = BeautifulSoup(response.text,"lxml")
proxy = [':'.join([item.select_one("td").text,item.select_one("td:nth-of-type(2)").text]) for item in soup.select("table.table tbody tr") if "yes" in item.text]
return proxy
class ProxySpider(scrapy.Spider):
name = "proxiedscript"
handle_httpstatus_list = [503]
proxy_vault = get_proxies()
check_url = "https://yts.am/browse-movies"
def start_requests(self):
random.shuffle(self.proxy_vault)
proxy_url = next(cycle(self.proxy_vault))
request = scrapy.Request(self.check_url,callback=self.parse,dont_filter=True)
request.meta['https_proxy'] = f'http://{proxy_url}'
yield request
def parse(self,response):
print(response.meta)
if "DDoS protection by Cloudflare" in response.css(".attribution > a::text").get():
random.shuffle(self.proxy_vault)
proxy_url = next(cycle(self.proxy_vault))
request = scrapy.Request(self.check_url,callback=self.parse,dont_filter=True)
request.meta['https_proxy'] = f'http://{proxy_url}'
yield request
else:
for item in response.css(".browse-movie-wrap a.browse-movie-title::attr(href)").getall():
nlink = response.urljoin(item)
yield scrapy.Request(nlink,callback=self.parse_details)
def parse_details(self,response):
name = response.css("#movie-info h1::text").get()
yield {"Name":name}
if __name__ == "__main__":
c = CrawlerProcess({'USER_AGENT':'Mozilla/5.0'})
c.crawl(ProxySpider)
c.start()
Чтобы убедиться, что запрос проксируется, я напечатал response.meta
и мог получить результаты, подобные этому {'https_proxy': 'http://142.93.127.126:3128', 'download_timeout': 180.0, 'download_slot': 'yts.am', 'download_latency': 0.237013578414917, 'retry_times': 2, 'depth': 0}
.
Поскольку я злоупотребил ссылкой, чтобы проверить, как работает прокси-запрос в scrapy, в данный момент я получаю ошибку 503 Service Unavailable
, и я вижу это ключевое слово в ответе DDoS protection by Cloudflare
. Тем не менее, я получаю действительный ответ, когда пытаюсь с модулем requests
применить ту же логику, что и здесь.
My earlier question: why I can't get the valid response as (I suppose) I'm using proxies in the right way? [solved]
Вопрос о вознаграждении: как я могу определить предложение try/except
в моем скрипте, чтобы он пытался использовать разные прокси, как только выдает ошибку соединения с определенным прокси?