Все еще новичок во всем этом, так что заранее извините, если мой код покажется беспорядочным или нечитабельным, постараюсь изо всех сил объяснить.
Итак, что происходит, моя программа предоставит идентификатор в одном потоке, который затем передаст его в очередь другому потоку, который затем использует предоставленный идентификатор для перехода на определенный c веб-сайт, на котором есть таблица. Затем он будет использовать суп, чтобы захватить содержимое таблицы и затем распечатать его в книге, затем программа захватит следующий идентификатор, go, на следующую веб-страницу, выберет другую таблицу и добавит новую таблицу в книгу (Под предыдущую таблицу, поэтому не перезаписывайте ее).
Проблема, с которой я столкнулся, заключается в том, что моя программа отлично печатает первые две таблицы, однако, когда она переходит к следующей, она начинает перезаписывать данные в книге и я не уверен, почему это происходит.
Вторая проблема, с которой я, похоже, сталкиваюсь, заключается в том, что из-за того, как у меня есть мой код (по крайней мере, из того, что я вижу), он должен работать без остановок, пока идентификаторы, начинающиеся с 5159152 и идущие до 0. Это может быть ошибка в моей потоковой передаче или просто ошибка при переходе на веб-страницу, однако я не уверен и совершенно запутался.
Мой код в настоящее время:
from bs4 import BeautifulSoup
import requests
from tabulate import tabulate
import queue
import random
import threading
import time
import concurrent.futures
import webbrowser, sys, requests, bs4, re, time
#from selenium import webdriver
import os
import xlwt
from xlwt import Workbook
def getRace(meetingNo, colCount):
url = "https://cris.rwwa.com.au/racefield.aspx?meeting="+ str(meetingNo) + "&race=1"
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
tables = soup.find_all("table")
table = tables[1]
rows = table.find_all("tr")
rows = rows[2:]
horseNumber = []
horseName = []
riderName = []
trainerName = []
rowCount = 0
for row in rows:
tds = row.find_all("td")
try:
horseNumber.append(tds[1].text)
horseName.append(tds[2].text)
riderName.append(tds[8].text)
trainerName.append(tds[9].text)
except Exception as e:
print(e)
try:
appendMeetingDetails(horseNumber, rowCount, colCount)
rowCount += 1
appendMeetingDetails(horseName, rowCount, colCount)
rowCount += 1
appendMeetingDetails(riderName, rowCount, colCount)
rowCount += 1
appendMeetingDetails(trainerName, rowCount, colCount)
except Exception as e:
print(e)
def getResults(meetingNo, colCount):
url = "https://cris.rwwa.com.au/raceresults.aspx?meeting="+ str(meetingNo) + "&race=1&fixtureid=cr"
r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")
tables = soup.find_all("table")
table = tables[2]
rows = table.find_all("tr")
rows = rows[2:]
startPrice = []
horseName = []
riderName = []
trainerName = []
horsePlacing = []
rowCount = 0
for row in rows:
tds = row.find_all("td")
try:
startPrice.append(tds[1].text)
horseName.append(tds[2].text)
riderName.append(tds[7].text)
trainerName.append(tds[8].text)
horsePlacing.append(tds[9].text)
except Exception as e:
print(e)
try:
appendResultDetails(startPrice, rowCount, colCount)
rowCount += 1
appendResultDetails(horseName, rowCount, colCount)
rowCount += 1
appendResultDetails(riderName, rowCount, colCount)
rowCount += 1
appendResultDetails(trainerName, rowCount, colCount)
rowCount += 1
appendResultDetails(horsePlacing, rowCount, colCount)
except Exception as e:
print(e)
def producer(queue, event):
meetingNumber = 5159152
while not event.is_set():
message = meetingNumber
queue.put(message)
meetingNumber -= 1
#time.sleep(0.5)
def consumer(queue, event):
meetingCount = 0
resultCount = 0
while not event.is_set() or not queue.empty():
message = queue.get()
getRace(message, meetingCount)
meetingCount += 1
getResults(message, resultCount)
resultCount += 1
#time.sleep(0.1)
def appendMeetingDetails(listDetails, rowCount, colCount):
colCount += 1
for x in listDetails:
meetingDetailsSheet.write(colCount, rowCount, str(x))
colCount += 1
def appendResultDetails(listDetails, rowCount, colCount):
colCount += 1
for x in listDetails:
resultDetailsSheet.write(colCount, rowCount, str(x))
colCount += 1
#Main Body
style = xlwt.easyxf('font: bold 1')
wb = Workbook()
meetingDetailsSheet = wb.add_sheet('meetingDetailsSheet')
resultDetailsSheet = wb.add_sheet('resultDetailsSheet')
meetingDetailsSheet.write(0, 0, 'Horse No', style)
meetingDetailsSheet.write(0, 1, 'Horse Name', style)
meetingDetailsSheet.write(0, 2, 'Rider Name', style)
meetingDetailsSheet.write(0, 3, 'Trainer Name', style)
resultDetailsSheet.write(0, 0, 'Start Price', style)
resultDetailsSheet.write(0, 1, 'Horse Name', style)
resultDetailsSheet.write(0, 2, 'Rider Name', style)
resultDetailsSheet.write(0, 3, 'Trainer Name', style)
resultDetailsSheet.write(0, 4, 'Horse Placing', style)
if __name__ == "__main__":
pipeline = queue.Queue(maxsize=10)
event = threading.Event()
with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executor:
executor.submit(producer, pipeline, event)
executor.submit(consumer, pipeline, event)
time.sleep(0.1)
event.set()
wb.save('CRIS Details.xls')
Опять же, я новичок в многопоточности и xlwt, поэтому, если это возможно, приветствую любую помощь.