gpt4 book ai didi

python - 将输出抓取并写入文本文件

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:53 26 4
gpt4 key购买 nike

我使用 Python 2.7 编写了这个抓取程序,以从 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)

最佳答案

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

快速修复是更改 open mode'w''a',但稍微重组您的程序会更好。现在,tru_crawler 函数负责抓取您的站点并写入输出;相反,让每个函数只负责一件事是更好的做法。

您可以将您的抓取功能变成一个 generator一次产生一个链接,然后将生成的输出分别写入一个文件。将三行 fob 替换为:

    yield href + '\n'

然后您可以执行以下操作:

lines = tru_crawler(3)
filename = 'c:/test/true.txt'
with open(filename, 'w') as handle:
handle.writelines(lines)

还要注意 with statement 的用法;使用 with 打开文件会在该 block 结束后自动将其关闭,从而使您不必自己调用 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_urls 调用,或为其他 URL 模式创建不同的生成器,其余代码无需更改!

关于python - 将输出抓取并写入文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619895/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com