Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多线程抓取Html并安全地保存到一个文件_Python_Multithreading_Web Scraping - Fatal编程技术网

Python 多线程抓取Html并安全地保存到一个文件

Python 多线程抓取Html并安全地保存到一个文件,python,multithreading,web-scraping,Python,Multithreading,Web Scraping,我想在5个线程的多线程示例中从给定的url中刮取标题 并将它们保存到一个文本文件中。如何做以及如何确保安全地将输出保存到一个文件 这是我的代码: import csv import requests requests.packages.urllib3.disable_warnings() urls = [] with open('Input.csv') as csvDataFile: csvReader = csv.reader(csvDataFile) for row in

我想在5个线程的多线程示例中从给定的url中刮取标题 并将它们保存到一个文本文件中。如何做以及如何确保安全地将输出保存到一个文件

这是我的代码:

import csv
import requests
requests.packages.urllib3.disable_warnings()

urls = []

with open('Input.csv') as csvDataFile:
    csvReader = csv.reader(csvDataFile)
    for row in csvReader:
        urls.append(row[1])

def find_between( s, first, last ):
    try:
        start = s.index( first ) + len( first )
        end = s.index( last, start )
        return s[start:end]
    except ValueError:
        return ""

def get_title( url ):
    try:
        r = requests.get(url)
        html_content = r.text.encode('UTF-8')
        title = find_between(html_content , "<title>", "</title>")
        return title
    except:
        return ""

for url in urls:
    f = open('myfile.txt', 'a')
    f.write(get_title(url) + '\n')
    f.close()
尝试使用期货 1.创建池 2.sumbit函数和参数 3.从函数中获取结果


我会使用asyncio,但如果你是在python3世界中,你可以再次使用future或multiprocess,我懒得为你编写它。这是一个很大的工作,你的脚本,它将保存到文件后,所有工人完成。我们怎样才能在不等待工人完成工作的情况下保存它?@TutikMasfiyah更难的是,你需要一把锁。
import csv
from concurrent import futures
pool = futures.ThreadPoolExecutor(5)
workers = [pool.sumbit(get_title,url) for url in urls]
while not all(worker.done() for worker in workers):
   pass
with open(file) as f:
   w = csv.writer(f)
   w.writerows([[worker.result()] for worker in workers])