我使用python与Thread
结合使用创建了一个刮板,以加快执行速度。刮板应该解析网页中所有以不同字母结尾的链接。它会全部解析它们。
但是,我希望再次使用names
解析那些单独链接中的所有phone
和Thread
数字。我可以使用Thread
来运行的第一部分,但是我不知道如何创建另一个Thread
来执行脚本的后半部分?
我本可以将它们包装在单个Thread
中,但我的目的是要知道如何使用两个Threads
执行两个功能。
对于第一部分:我尝试如下进行操作,
import requests
import threading
from lxml import html
main_url = "https://www.houzz.com/proListings/letter/{}"
def alphabetical_links(mainurl):
response = requests.get(link).text
tree = html.fromstring(response)
return [container.attrib['href'] for container in tree.cssselect(".proSitemapLink a")]
if __name__ == '__main__':
linklist = []
for link in [main_url.format(chr(page)) for page in range(97,123)]:
thread = threading.Thread(target=alphabetical_links, args=(link,))
thread.start()
linklist+=[thread]
for thread in linklist:
thread.join()
我的问题是:如何在另一个sub_links()
Thread
功能
import requests
import threading
from lxml import html
main_url = "https://www.houzz.com/proListings/letter/{}"
def alphabetical_links(mainurl):
response = requests.get(link).text
tree = html.fromstring(response)
return [container.attrib['href'] for container in tree.cssselect(".proSitemapLink a")]
def sub_links(process_links):
response = requests.get(process_links).text
root = html.fromstring(response)
for container in root.cssselect(".proListing"):
try:
name = container.cssselect("h2 a")[0].text
except Exception: name = ""
try:
phone = container.cssselect(".proListingPhone")[0].text
except Exception: phone = ""
print(name, phone)
if __name__ == '__main__':
linklist = []
for link in [main_url.format(chr(page)) for page in range(97,123)]:
thread = threading.Thread(target=alphabetical_links, args=(link,))
thread.start()
linklist+=[thread]
for thread in linklist:
thread.join()
答案 0 :(得分:2)
尝试使用自己的线程更新alphabetical_links
:
import requests
import threading
from lxml import html
main_url = "https://www.houzz.com/proListings/letter/{}"
def alphabetical_links(mainurl):
response = requests.get(mainurl).text
tree = html.fromstring(response)
links_on_page = [container.attrib['href'] for container in tree.cssselect(".proSitemapLink a")]
threads = []
for link in links_on_page:
thread = threading.Thread(target=sub_links, args=(link,))
thread.start()
threads.append(thread)
for thread in threads:
thread.join()
def sub_links(process_links):
response = requests.get(process_links).text
root = html.fromstring(response)
for container in root.cssselect(".proListing"):
try:
name = container.cssselect("h2 a")[0].text
except Exception: name = ""
try:
phone = container.cssselect(".proListingPhone")[0].text
except Exception: phone = ""
print(name, phone)
if __name__ == '__main__':
linklist = []
for link in [main_url.format(chr(page)) for page in range(97,123)]:
thread = threading.Thread(target=alphabetical_links, args=(link,))
thread.start()
linklist+=[thread]
for thread in linklist:
thread.join()
请注意,这只是如何管理“内部线程”的示例。由于同时启动了多个线程,因此由于资源不足,系统可能无法启动其中一些线程,并且您将获得RuntimeError: can't start new thread
异常。在这种情况下,您应该尝试实现 ThreadPool
答案 1 :(得分:0)
您可以像启动第一个线程一样启动更多线程
from threading import Thread
t1 = Thread(target=alphabetical_links, kwargs={
'mainurl': link,
})
t1.start()
t2 = Thread(target=sub_links, kwargs={
'process_links': link,
})
t2.start()