Python 抓取并将输出写入文本文件
我使用Python2.7编写了这个scraper,从TrueLocal.com.au的前3个页面获取链接,并将它们写入文本文件 当我运行程序时,只有第一个链接写入文本文件。如何才能将返回的所有URL写入文件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.
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)
很抱歉没有尽快回复。非常感谢您的详细回答。它工作得很好!