Python 抓取并将输出写入文本文件

Python 抓取并将输出写入文本文件,python,python-2.7,beautifulsoup,Python,Python 2.7,Beautifulsoup,我使用Python2.7编写了这个scraper,从TrueLocal.com.au的前3个页面获取链接,并将它们写入文本文件 当我运行程序时,只有第一个链接写入文本文件。如何才能将返回的所有URL写入文件 import requests from bs4 import BeautifulSoup def tru_crawler(max_pages): page = 1 while page <= max_pages: url = 'http://www.

我使用Python2.7编写了这个scraper,从TrueLocal.com.au的前3个页面获取链接,并将它们写入文本文件

当我运行程序时,只有第一个链接写入文本文件。如何才能将返回的所有URL写入文件

import requests
from bs4 import BeautifulSoup

def tru_crawler(max_pages):
    page = 1
    while page <= max_pages:
        url = 'http://www.truelocal.com.au/find/car-rental/' + str(page)
        code = requests.get(url)
        text = code.text
        soup = BeautifulSoup(text)
        for link in soup.findAll('a', {'class':'name'}):
            href = 'http://www.truelocal.com.au' + link.get('href')
            fob = open('c:/test/true.txt', 'w')
            fob.write(href + '\n')
            fob.close()
            print (href)
        page += 1

#Run the function
tru_crawler(3)
导入请求
从bs4导入BeautifulSoup
def tru_爬虫程序(最大页数):
页码=1

当page时,您的问题是,对于每个链接,您打开输出文件,写入它,然后再次关闭该文件。这不仅效率低下,而且除非每次都以“附加”模式打开文件,否则它将被覆盖。实际情况是,最后一个链接留在文件中,之前的所有内容都丢失了

快速修复方法是将
'w'
更改为
'a'
,但最好稍微重新构造程序。现在,
tru_crawler
功能负责抓取站点和编写输出;相反,更好的做法是让每个函数只负责一件事

您可以将爬网函数转换为一次生成一个链接的函数,然后将生成的输出分别写入文件。将三行
fob
替换为:

    yield href + '\n'
然后您可以执行以下操作:

lines = tru_crawler(3)
filename = 'c:/test/true.txt'
with open(filename, 'w') as handle:
    handle.writelines(lines)
还要注意的用法;使用
with
打开文件会在该块结束后自动将其关闭,这样您就不必自己调用
close()


进一步考虑生成器和任务分离的概念,您可能会注意到
tru_crawler
函数还负责生成要爬网的URL列表。如果你的爬虫程序接受一组URL,而不是自己创建它们,那么这也可以分开。比如:

def make_urls(base_url, pages):
    for page in range(1, pages+1):
        yield base_url + str(page)

def crawler(urls):
    for url in urls:
        #fetch, parse, and yield hrefs
然后,它不再调用tru_crawler(3)
,而是:

urls = make_urls('http://www.truelocal.com.au/find/car_rental/', 3)
lines = crawler(urls)
然后按上述步骤进行


现在,如果你想爬网其他网站,你可以只更改你的
make_URL
调用,或者为其他URL模式创建不同的生成器,其余的代码不需要更改

默认情况下,“w”是截断模式,您可能需要追加模式。请参阅:

也许将您的HREF附加到while循环中的一个列表中,然后稍后写入该文件看起来是可读的。或者按照建议使用
产量
提高效率

差不多

with open('c:/test/true.txt', 'w') as fob:
    fob.writelines(yourlistofhref)

很抱歉没有尽快回复。非常感谢您的详细回答。它工作得很好!