Python запросов возвращает мне статус 200, но не выполняет ожидаемое действие - PullRequest
0 голосов
/ 06 апреля 2020

Я пытаюсь создать приложение, которое может как сообщения с несколькими профилями одновременно. Я пытаюсь распараллелить входы в систему и для каждого пользователя, который выполнил лайк постов параллельно, как показано ниже.

with ProcessPoolExecutor() as exe:
    bot = Insta()
    results = []
    for credential in credentials: # go through credentials, login in parallel.
        results.append(
            exe.submit(bot.login, credential) # Each login takes 15 sec
        ) # Add status of each process in a list
    for result in as_completed(results): # When complete, I call like
        if result.result() == 200:
            with Pool(4) as p:
                resp = p.map(bot.like, urls)
                print(resp)            

Несмотря на возвращение мне status_code 200, когда я смотрю пост, он не понравился .

Когда я пытаюсь сделать это индивидуально для каждого логина, мне возвращается одно и то же, но на этот раз пост действительно понравился. То есть:

bot = Insta()
resp = bot.login(credential)
if resp == 200:
    with Pool(5) as p:
        p.map(bot.like, urls)

Может кто-нибудь сказать мне, в чем проблема? Я хотел бы знать, если я делаю что-то не так. Мой похожий метод выглядит следующим образом:

    def like(self, url_post):
        self._set_id_post(url_post)  # id of post
        resp = self.session.get(url_post)
        self.session.headers = {'user-agent': self.user_agent}
        self.session.headers.update({'Referer': url_post})
        self.session.headers.update({'X-CSRFToken': resp.cookies['csrftoken']}, )

        url = endpoints['like_url'] % self.post_id
        time.sleep(random.gauss(6, 1.5))
        response = self.session.post(url)
        self.session.headers.update({'X-CSRFToken': resp.cookies['csrftoken']})
        if response.status_code == 200:
            return response.status_code
        elif response.status_code == 403:
            return response.status_code

        elif response.status_code == 400:
            return response.status_code

1 Ответ

0 голосов
/ 11 апреля 2020

Я решил эту проблему, установив прокси для каждого пользователя. Я должен был купить это, потому что publi c не работал в моем случае. Но для тех, у кого есть похожие проблемы с Web Scraping, за исключением социальных сетей, я вставлю здесь один из моих кодов для возврата прокси-элиты бесплатных сайтов, которые, возможно, могут помочь.

def free_proxy_list():
    options = Options()
    options.headless = True
    driver = webdriver.Chrome(options=options)
    driver.get('https://free-proxy-list.net/')
    # Show only Elite Proxies
    driver.find_element_by_xpath('//*[@id="proxylisttable"]/tfoot/tr/th[5]/select/option[3]').click()
    # Show only SSl
    driver.find_element_by_xpath('//*[@id="proxylisttable"]/tfoot/tr/th[7]/select/option[3]').click()
    proxies = []
    # Paginate 1
    for i in range(1, 21):
        xpath_ip = driver.find_element_by_xpath('//*[@id="proxylisttable"]/tbody/tr[%s]/td[1]' % i).text
        xpath_port = driver.find_element_by_xpath('//*[@id="proxylisttable"]/tbody/tr[%s]/td[2]' % i).text
        proxy = xpath_ip + ":" + xpath_port
        proxies.append(proxy)
    # Paginate 2
    driver.find_element_by_xpath('//*[@id="proxylisttable_paginate"]/ul/li[4]/a').click()
    try:
        for i in range(1, 21):
            xpath_ip = driver.find_element_by_xpath('//*[@id="proxylisttable"]/tbody/tr[%s]/td[1]' % i).text
            xpath_port = driver.find_element_by_xpath('//*[@id="proxylisttable"]/tbody/tr[%s]/td[2]' % i).text
            proxy = xpath_ip + ":" + xpath_port
            proxies.append(proxy)
    except NoSuchElementException:
        return proxies

    return proxies
...