Ошибка обхода (403) при входе в glassdoor.com использование scrapy в python. Нужно решение?

#python #web-scraping #scrapy

#python #веб-очистка #scrapy

Вопрос:

Вот полный код, при запуске кода возникает ошибка «Crawled (403)«. Если я обойду ошибку HTTP, используя HTTPERROR_ALLOWED_CODES =[403] в setting.py , затем код начнет работать.

Но мне нужно решение для входа на сайт.

 import scrapy
from urllib.parse import urljoin
from scrapy.http import Request,FormRequest

class MoorSpider(scrapy.Spider):
name = 'moor'
allowed_domains = ['glassdoor.com']
start_urls = ['https://www.glassdoor.com/profile/login_input.htm']
page_number = 2

    
    def parse(self,response):
        token = response.xpath('.//*[@name="gdToken"]/@value').extract()
        # print(token)
        yield FormRequest('https://www.glassdoor.com/profile/ajax/loginSecureAjax.htm', formdata={'username':'likej41679@94jo.com','password':'1a2b3c4d','gdToken':token}, callback=self.startscraper)
    
    
    def startscraper(self,response):
        yield Request('https://www.glassdoor.com/Explore/browse-companies.htm?overall_rating_low=3.5amp;page=1amp;isHiringSurge=0amp;locId=1282amp;locType=Samp;locName=North Carolina, US, US', callback=self.startscraper1)
    
    
    
    def startscraper1(self,response):
        urls = response.css('.col-12.my-0.mt-sm.mt-sm-std.order-5 a::attr(href)').extract()
        # print(next_page)
        for url in urls:
            url1 = urljoin('https://www.glassdoor.com/', url)
            yield Request(url1, callback=self.DetailPage)
    
        # next_page = 'https://www.glassdoor.com/Explore/browse-companies.htm?overall_rating_low=3.5amp;page=' str(MoorSpider.page_number) 'amp;isHiringSurge=0amp;locId=1282amp;locType=Samp;locName=North Carolina, US, US'
        next_page = 'https://www.glassdoor.com/Explore/browse-companies.htm?overall_rating_low=3.5amp;page='   str(
            MoorSpider.page_number)   'amp;isHiringSurge=0amp;locId=1282amp;locType=Samp;locName=North Carolina, US, US'
        if MoorSpider.page_number <= 2:
            MoorSpider.page_number  = 1
            yield response.follow(next_page, callback=self.startscraper1)
    
    
    def DetailPage(self,response):
        Company_Website=response.css('[data-test="employer-website"]::text').get()
        Company_Revenue = response.css('[data-test="employer-revenue"]::text').get()
        Company_Description = response.css('span[data-test="employerDescription"]::text').get()
        Company_Mission = response.css('span[data-test="employerMission"]::text').get()
    
        yield {
            'Company_Website':Company_Website,
            'Company_Revenue':Company_Revenue,
            'Company_Description':Company_Description,
            'Company_Mission':Company_Mission,
    
        }
 

Ответ №1:

Замените существующий parse метод следующим, чтобы он работал. Оказывается, что ваша переменная token ничего не содержит, поскольку она генерируется динамически. Однако вы можете проанализировать значение gdToken out из некоторого тега скрипта.

 def parse(self,response):
    token = response.css('body').re(r"gdToken":"(.*?)",")[0]
    yield FormRequest('https://www.glassdoor.com/profile/ajax/loginSecureAjax.htm', formdata={'username':'likej41679@94jo.com','password':'1a2b3c4d','gdToken':token}, callback=self.startscraper)