2016-06-09 33 views
0

我想知道如何將抓取的結果導出到我爬過的每個不同城市的多個csv文件。不知何故,我跑進了城牆,沒有找到合適的方法來整理。將輸出抓取到多個csv文件

這是我的代碼:

import requests 
from bs4 import BeautifulSoup 
import csv 

user_agent = {'User-agent': 'Chrome/43.0.2357.124'} 
output_file= open("TA.csv", "w", newline='') 
RegionIDArray = [187147,187323,186338] 
dict = {187147: 'Paris', 187323: 'Berlin', 186338: 'London'} 
already_printed = set() 

for reg in RegionIDArray: 
    for page in range(1,700,30): 
     r = requests.get("https://www.tripadvisor.de/Attractions-c47-g" + str(reg) + "-oa" + str(page) + ".html") 
     soup = BeautifulSoup(r.content) 

     g_data = soup.find_all("div", {"class": "element_wrap"}) 

     for item in g_data: 
      header = item.find_all("div", {"class": "property_title"}) 
      item = (header[0].text.strip()) 
      if item not in already_printed: 
       already_printed.add(item) 

       print("POI: " + str(item) + " | " + "Location: " + str(dict[reg])) 

       writer = csv.writer(output_file) 
       csv_fields = ['POI', 'Locaton'] 
       if g_data: 
        writer.writerow([str(item), str(dict[reg])]) 

我的目標將是我得到三個sperate CSV文件巴黎,柏林和倫敦,而不是讓一個大的CSV文件中所有的結果。

你們能幫我嗎?感謝您的反饋:)

+0

你可能要考慮,而不是登錄內容API:https://developer-tripadvisor.com/content-api/ – Riaz

+0

感謝您的反饋意見。我很清楚這一點,但我想自己抓取它。不知何故,它的動機,而不是使用API​​;) –

+0

如果你想根據內容寫入三個不同的文件,你必須有三個單獨的csv.writer,測試內容並寫入正確的文件,取決於測試結果。 – wwii

回答

1

我對代碼做了一些小修改。爲了爲每個語言環境創建文件,我在循環內移動了out_file名稱。

請注意,我現在沒有時間了,最​​後一行是忽略unicode錯誤的黑客行爲 - 它只是跳過嘗試輸出非ascii字符的行。 Thas不好。也許有人可以修復那部分?

import requests 
from bs4 import BeautifulSoup 
import csv 

user_agent = {'User-agent': 'Chrome/43.0.2357.124'} 
RegionIDArray = {187147: 'Paris', 187323: 'Berlin', 186338: 'London'} 
already_printed = set() 

for reg in RegionIDArray: 
    output_file= open("TA" + str(reg) + ".csv", "w") 
    for page in range(1,700,30): 
     r = requests.get("https://www.tripadvisor.de/Attractions-c47-g" + str(reg) + "-oa" + str(page) + ".html") 
     soup = BeautifulSoup(r.content) 

     g_data = soup.find_all("div", {"class": "element_wrap"}) 

     for item in g_data: 
      header = item.find_all("div", {"class": "property_title"}) 
      item = (header[0].text.strip()) 
      if item not in already_printed: 
       already_printed.add(item) 

       # print("POI: " + str(item) + " | " + "Location: " + str(RegionIDArray[reg])) 

       writer = csv.writer(output_file) 
       csv_fields = ['POI', 'Locaton'] 
       if g_data: 
        try: 
         writer.writerow([str(item), str(RegionIDArray[reg])]) 
        except: 
         pass