Я изо всех сил пытаюсь получить свой код, который извлекает информацию из HTML-таблицы из Интернета, для работы со списком веб-сайтов, содержащихся в файле ShipURL.txt. Код считывает адреса веб-страницы из ShipURL, а затем переходит по ссылке, загружает данные таблицы и сохраняет их в CSV. Но моя проблема в том, что программа не может завершиться, так как ошибка " Попытка подключения не удалась, потому что подключенная сторона не ответила должным образом через некоторое время, или не удалось установить соединение, потому что подключенный хост не смог ответить "происходит в середине и программа останавливается. Теперь, насколько я понимаю, мне нужно увеличить время запроса, использовать прокси или сделать попытку. Я просмотрел несколько ответов, касающихся той же проблемы, но как новичок мне трудно это понять. Любая помощь будет оценена.

ShipURL.txt https://dl.dropboxusercontent.com/u/110612863/ShipURL.txt

# -*- coding: utf-8 -*-
fm = open('ShipURL.txt', 'r')
Shiplinks = fm.readlines()

import csv
from urllib import urlopen
from bs4 import BeautifulSoup
import re
for line in Shiplinks:
    website = re.findall(r'(https?://\S+)', line)
    website = "".join(str(x) for x in website)
    if website != "":

    with open('ShipData.csv','wb')as f:                         #Creates an empty csv file to which assign values.
        writer = csv.writer(f)
        shipUrl = website
        shipPage = urlopen(shipUrl)

        soup = BeautifulSoup(shipPage, "html.parser")           #Read the web page HTML
        table = soup.find_all("table", { "class" : "table1" })  #Finds table with class table1
        List = []
        columnRow = ""
        valueRow = ""
        Values = []
        for mytable in table:                                   #Loops tables with class table1
            table_body = mytable.find('tbody')                  #Finds tbody section in table
            try:                                                #If tbody exists
                rows = table_body.find_all('tr')                #Finds all rows
                for tr in rows:                                 #Loops rows
                    cols = tr.find_all('td')                    #Finds the columns
                    i = 1                                       #Variable to control the lines
                    for td in cols:                             #Loops the columns
    ##                    print td.text                           #Displays the output
                        co = td.text                            #Saves the column to a variable
    ##                    writer.writerow([co])                 Writes the variable in CSV file row
                        if i == 1:                              #Checks the control variable, if it equals to 1

                            if td.text[ -1] == ":":
                                # võtab kooloni maha ja lisab koma järele
                                columnRow += td.text.strip(":") + "," # Tekkis mõte, et vb oleks lihtsam kohe ühte string panna
                                List.append(td.text)                #.. takes the column value and assigns it to a list called 'List' and..
                                i+=1                                #..Increments i by one

                        else:
                            # võtab reavahetused maha ja lisab koma stringile
                            valueRow += td.text.strip("\n") + ","
                            Values.append(td.text)              #Takes the second columns value and assigns it to a list called Values
                        #print List                             #Checking stuff
                        #print Values                           #Checking stuff


            except:
                print "no tbody"
        # Prindime pealkirjad ja väärtused koos reavahetusega välja ka :)
        print columnRow.strip(",")
        print "\n"
        print valueRow.strip(",")
        # encode'ing hakkas jälle kiusama
        # Kirjutab esimeseks reaks veeru pealkirjad ja teiseks väärtused
        writer.writerow([columnRow.encode('utf-8')])
        writer.writerow([valueRow.encode('utf-8')])
0
Gert Lõhmus 16 Дек 2015 в 18:04

3 ответа

Лучший ответ

Я бы обернул твой вызов урлопен попыткой / уловом. Как это:

try:
  shipPage = urlopen(shipUrl)
except Error as e:
  print e

Это по крайней мере поможет вам понять, где происходит ошибка. Без дополнительных файлов было бы трудно устранить неполадки, в противном случае.

Документация по ошибкам Python

1
Eric 29 Авг 2017 в 18:10

Нашел отличную информацию по этой ссылке: Как повторить попытку после исключения в python? Это в основном моя проблема с подключением, поэтому я решил попробовать, пока это не удастся. На данный момент это работает. Решил проблему с этим кодом:

 while True:
                try:
                    shipPage = urllib2.urlopen(shipUrl,timeout=5)
                except Exception as e:
                    continue
                break

Но я благодарю всех здесь, вы помогли мне понять проблему намного лучше!

0
Community 23 Май 2017 в 11:45

Веб-сайты защищают себя от DDOS-атак, предотвращая последовательный доступ с одного IP.

Вы должны поставить время сна между каждым доступом, или при каждых 10 доступах или 20 или 50.

Или вам может потребоваться анонимный доступ через сеть Tor или любую другую альтернативу

0
BigOther 16 Дек 2015 в 16:08