Как интегрировать IP-велосипед в мою программу веб-скрепинга? Я продолжаю блокироваться от Crunchbase - PullRequest
0 голосов
/ 13 июня 2019

Я написал программу, которая использует Beautiful Soup для извлечения информации о финансировании из Crunchbase для списка компаний и экспорта этой информации в файл CSV.Я даже распределил свои запросы на 30 секунд, и до сегодняшнего дня программа работала нормально - теперь я не могу даже отправить один запрос, не получив HTTPError: Forbidden.

Я читал об этом иЛюди создавали программы IP-циклов, потому что похоже, что Crunchbase блокировал мой IP-адрес - даже если я включаю свой пользовательский агент, я все равно блокируюсь.Я даже попытался использовать пару бесплатных VPN, но я все еще заблокирован.

import urllib.request
from bs4 import BeautifulSoup
import csv
import time
import random

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 
Safari/537.36'
headers = {'User-Agent': user_agent, }

def scraper(url):
    return_list = []

    try:
        request = urllib.request.Request(url, None, headers)
        response = urllib.request.urlopen(request)
    except:
        return_list.append("No Crunchbase Page Found")
        return_list.append("No Crunchbase Page Found")
        print("Not found")
    else:
        data = response.read()
        soup = BeautifulSoup(data, "html.parser")

        try:
            funding_status = soup.find_all("span", class_= "component--field-formatter field-type-enum ng-star-inserted")[1].text
            return_list.append(funding_status)
        except:
            return_list.append("N/A")

        try:
            last_funding_type = soup.find("a", class_= "cb-link component--field-formatter field-type-enum ng-star-inserted").text
            if last_funding_type[:6] != "Series" and last_funding_type[:7] != "Venture" and last_funding_type[:4] != "Seed" and last_funding_type[:3] != "Pre" and last_funding_type[:5] != "Angel" and last_funding_type[:7] != "Private" and last_funding_type[:4] != "Debt" and last_funding_type[:11] != "Convertible" and last_funding_type[:5] != "Grant" and last_funding_type[:9] != "Corporate" and last_funding_type[:6] != "Equity" and last_funding_type[:7] != "Product" and last_funding_type[:9] != "Secondary" and last_funding_type[:4] != "Post" and last_funding_type[:3] != "Non" and last_funding_type[:7] != "Initial" and last_funding_type[:7] != "Funding":
                return_list.append("N/A")
            else:
                return_list.append(last_funding_type)
        except:
            return_list.append("N/A")

    return return_list


user_input = input("CSV File Name (e.g: myfile.csv): ")
user_input2 = input("New CSV file name (e.g: newfile.csv): ")
print()
scrape_file = open(user_input, "r", newline = '', encoding = "utf-8")
row_count = sum(1 for row in csv.reader(scrape_file))
scrape_file = open(user_input, "r", newline = '', encoding = "utf-8")

new_file = open(user_input2, "w", newline = '', encoding = "utf-8")
writer = csv.writer(new_file)
writer.writerow(["Company Name", "Description", "Website", "Founded", 
"Product Name", "Country", "Funding Status", "Last Funding Type"])

count = 0
for row in csv.reader(scrape_file):
    company_name = row[0]
    if company_name == "Company Name":
        continue

    count += 1
    print("Scraping company {} of {}".format(count, row_count))

    company_name = company_name.replace(",", "")
    company_name = company_name.replace("'", "")
    company_name = company_name.replace("-", " ")
    company_name = company_name.replace(".", " ")
    s = "-"
    join_name = s.join(company_name.lower().split())
    company_url = "https://www.crunchbase.com/organization/" + join_name

    writer.writerow([row[0], row[1], row[2], row[3], row[4], row[5], scraper(company_url)[0], scraper(company_url)[1]])
    time.sleep(random.randint(30, 40))
new_file.close()
print("Done! You can now open your file %s." % user_input2)

Я был бы очень признателен, если бы кто-то мог указать мне правильное направление для интеграции IP-циклов в этот проект, чтобыон отправляет запросы с разных IP-адресов!Я не собираюсь платить за частные прокси, но я видел, как люди делают это с публичными адресами.Спасибо!

1 Ответ

1 голос
/ 13 июня 2019

Если вы хотите получить ответ, вам нужен какой-нибудь прокси, ваш собственный, например, squidproxy, платный частный прокси или публичный (или VPN, как вы упомянули).Обойти это невозможно.Вы можете подделать свой IP-адрес в пакете, который вы отправляете на некоторый ложный IP-адрес, но тогда вы не получите ответ.Если вы хотите использовать прокси-сервер, я бы предложил использовать отличную библиотеку requests, так как она является инструментом выбора для многих людей, занимающихся утилизацией веб-страниц, и использовать прокси-сервер с ним очень просто.Ниже приведен пример:

import requests
proxies = {
  'http': 'http://10.10.1.10:3128', #this could be an public proxy address
  'https': 'http://10.10.1.10:1080',
}
requests.get("https://www.google.com",proxies=proxies)

, и если вы хотите циклически проходить по списку публичных прокси, просто зацикливайтесь на нем, обрабатывая исключения следующим образом:

import requests
import logging
proxies = [{
  'http': 'http://10.10.1.10:3128', #this could be an public proxy address
  'https': 'http://10.10.1.10:1080',
},...]

for proxy in proxies:
    try:
        requests.get("https://www.google.com",proxies=proxies)
        break
    except Exception as e:
        logging.exception(e)
        continue


...