Я пишу программу Scrapy, и я вхожу и собираю данные для разных игральных карт на этом сайте, http: // www .starcitygames.com / buylist /. Но я собираю только значения идентификаторов из этого URL-адреса, а затем перенаправляю на другой URL-адрес, используя этот номер идентификатора, очищаю веб-страницу JSON и делаю это для всех 207 различных категорий карт. Я выгляжу немного более аутентично, чем просто перейти к URL с данными JSON. В любом случае, я уже писал программу Scrapy с несколькими URL-адресами, и я могу настроить эти программы для ротации прокси и пользовательских агентов, но как мне это сделать в этой программе? Поскольку технически существует только один URL-адрес, есть ли способ настроить его на переключение на другой прокси-сервер и пользовательский агент после того, как он выберет около 5 или около того разных страниц данных JSON? Я не хочу, чтобы он вращался случайно. Я хотел бы, чтобы он каждый раз очищал одну и ту же веб-страницу JSON одним и тем же прокси-сервером и агентом пользователя. Я надеюсь, что все имеет смысл. Это может быть немного широким для переполнения стека, но я понятия не имею, как это сделать, поэтому я решил, что в любом случае попросил бы, есть ли у кого-нибудь хорошие идеи о том, как это сделать.

# Import needed functions and call needed python files
import scrapy
import json
from scrapy.spiders import Spider
from scrapy_splash import SplashRequest
from ..items import DataItem

# Spider class
class LoginSpider(scrapy.Spider):
    # Name of spider
    name = "LoginSpider"

    #URL where dated is located
    start_urls = ["http://www.starcitygames.com/buylist/"]

    # Login function
    def parse(self, response):
        # Login using email and password than proceed to after_login function
        return scrapy.FormRequest.from_response(
        response,
        formcss='#existing_users form',
        formdata={'ex_usr_email': 'example@email.com', 'ex_usr_pass': 'password'},
        callback=self.after_login
        )


    # Function to barse buylist website
    def after_login(self, response):
        # Loop through website and get all the ID numbers for each category of card and plug into the end of the below
        # URL then go to parse data function
        for category_id in response.xpath('//select[@id="bl-category-options"]/option/@value').getall():
            yield scrapy.Request(
                    url="http://www.starcitygames.com/buylist/search?search-type=category&id={category_id}".format(category_id=category_id),
                    callback=self.parse_data,
                    )
    # Function to parse JSON dasta
    def parse_data(self, response):
        # Declare variables
        jsonreponse = json.loads(response.body_as_unicode())
        # Call DataItem class from items.py
        items = DataItem()

        # Scrape category name
        items['Category'] = jsonreponse['search']
        # Loop where other data is located
        for result in jsonreponse['results']:
            # Inside this loop, run through loop until all data is scraped
            for index in range(len(result)):
                # Scrape the rest of needed data
                items['Card_Name'] = result[index]['name']
                items['Condition'] = result[index]['condition']
                items['Rarity'] = result[index]['rarity']
                items['Foil'] = result[index]['foil']
                items['Language'] = result[index]['language']
                items['Buy_Price'] = result[index]['price']
                # Return all data
                yield items
0
Tom 4 Июл 2019 в 17:26

3 ответа

Лучший ответ

Я рекомендую этот пакет для вас Scrapy-UserAgents

pip install scrapy-useragents

В вашем файле setting.py

DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_useragents.downloadermiddlewares.useragents.UserAgentsMiddleware': 500,

}

Пример агента пользователя Список для поворота

Больше пользовательских агентов

USER_AGENTS = [
    ('Mozilla/5.0 (X11; Linux x86_64) '
     'AppleWebKit/537.36 (KHTML, like Gecko) '
     'Chrome/57.0.2987.110 '
     'Safari/537.36'),  # chrome
    ('Mozilla/5.0 (X11; Linux x86_64) '
     'AppleWebKit/537.36 (KHTML, like Gecko) '
     'Chrome/61.0.3163.79 '
     'Safari/537.36'),  # chrome
    ('Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) '
     'Gecko/20100101 '
     'Firefox/55.0'),  # firefox
    ('Mozilla/5.0 (X11; Linux x86_64) '
     'AppleWebKit/537.36 (KHTML, like Gecko) '
     'Chrome/61.0.3163.91 '
     'Safari/537.36'),  # chrome
    ('Mozilla/5.0 (X11; Linux x86_64) '
     'AppleWebKit/537.36 (KHTML, like Gecko) '
     'Chrome/62.0.3202.89 '
     'Safari/537.36'),  # chrome
    ('Mozilla/5.0 (X11; Linux x86_64) '
     'AppleWebKit/537.36 (KHTML, like Gecko) '
     'Chrome/63.0.3239.108 '
     'Safari/537.36'),  # chrome
]

Будьте осторожны, это промежуточное ПО не может справиться с ситуацией, когда COOKIES_ENABLED имеет значение True, и веб-сайт связывает куки с User-Agent, это может привести к непредсказуемому результату паука.

1
AlexVasquez 4 Июл 2019 в 15:54

< Сильный > Доверенные Я бы получил компанию, которая предлагает ротатор, так что вам не нужно возиться с этим, однако вы можете написать специальное промежуточное ПО, я покажу вам, как. Что вы хотите сделать, это отредактировать метод запроса процесса. Это можно сделать как для смены прокси, так и для изменения пользовательского агента.

< Сильный > UserAgents Вы можете использовать промежуточное ПО для произвольного пользовательского агента Scrapy https://github.com/cleocn/scrapy-random- useragent или так можно изменить все, что вы хотите об объекте запроса, используя промежуточное программное обеспечение, включая прокси или любые другие заголовки.

# middlewares.py

user_agents = ['agent1', 'agent2', 'agent3', 'agent4']
proxies = ['ip1:port1', 'ip2:port2', 'ip3:port3', 'ip4:port4'

# either have your user agents in a file or something this assumes you are able to get them into a list.

class MyMiddleware(object):
    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        # Called for each request that goes through the downloader
        # middleware.

        # Must either:
        # - return None: continue processing this request
        # - or return a Response object
        # - or return a Request object
        # - or raise IgnoreRequest: process_exception() methods of
        #   installed downloader middleware will be called
        request.headers['User-Agent'] = random.choice(user_agents) # !! These 2 lines
        request.meta['proxy'] = random.choice(proxies) # !! These 2 lines
        return None

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

# settings.py


DOWNLOADER_MIDDLEWARES = {
    'project.middlewares.MyMiddleware': 543,
}

Рекомендации: https://docs.scrapy.org/en/latest/topics/ запрос- response.html

2
ThePyGuy 5 Июл 2019 в 04:29

ПОЛЬЗОВАТЕЛИ: Я использовал этот инструмент, который будет постоянно обновлять ваш список пользовательских агентов самыми последними и наиболее используемыми пользовательскими агентами: https://pypi.org/project/shadow-useragent/


    from shadow_useragent import ShadowUserAgent
    shadow_useragent = ShadowUserAgent()

     print(shadow_useragent.firefox)
     # Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0
     print(shadow_useragent.chrome)
     # Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36
     print(shadow_useragent.safari)
     # Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Safari/605.1.15
     print(shadow_useragent.edge)
     # Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134
     print(shadow_useragent.ie)
     # Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
     print(shadow_useragent.android)
     # Mozilla/5.0 (Linux; U; Android 4.3; en-us; SM-N900T Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
     print(shadow_useragent.ipad)
     # Mozilla/5.0 (iPad; CPU OS 12_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.1 Mobile/15E148 Safari/604.1
     print(shadow_useragent.random)
     # Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0

     print(shadow_useragent.random_nomobile)
     # Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36

    # and the best one, random via real world browser usage statistic
    print(ua.random)
    # Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36

    # if you want to excluse mobiles (some websites will display different pages)
    print(shadow_useragent.random_nomobile)
    # Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36

1
SimonR 13 Авг 2019 в 08:31