Класс BrokenLinkTest в приведенном ниже коде делает следующее.
- принимает URL-адрес веб-страницы
- находит все ссылки на веб-странице.
- получать заголовки ссылок одновременно (это делается для проверки, не повреждена ли ссылка)
- print 'completed', когда все заголовки получены.
from bs4 import BeautifulSoup
import requests
class BrokenLinkTest(object):
def __init__(self, url):
self.url = url
self.thread_count = 0
self.lock = threading.Lock()
def execute(self):
soup = BeautifulSoup(requests.get(self.url).text)
self.lock.acquire()
for link in soup.find_all('a'):
url = link.get('href')
threading.Thread(target=self._check_url(url))
self.lock.acquire()
def _on_complete(self):
self.thread_count -= 1
if self.thread_count == 0: #check if all the threads are completed
self.lock.release()
print "completed"
def _check_url(self, url):
self.thread_count += 1
print url
result = requests.head(url)
print result
self._on_complete()
BrokenLinkTest("http://www.example.com").execute()
Можно ли выполнить concurrency/синхронизацию. Я сделал это с помощью threading.Lock. Это мой первый эксперимент с потоками python.