度々の質問失礼致します。
下記車のECサイトの全40ページの車情報を取得したいと考えています。
そこでこちらでアドバイス頂き、私なりにカスタマイズしてスクレイピングしたいのですが、
- CSVファイルには最初の二つほどが出力されるのみ
- エラーが出る
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
- エラーが出ているために、しっかり次ページにループできてるのか不明
という状況で数時間困っているため、どなたかにご教示お願いできればと思います。
下記、私の書いたコードです。
Python
1import csv 2import urllib 3import time 4from bs4 import BeautifulSoup 5 6 7url = 'https://dubai.dubizzle.com/motors/used-cars/?page=1' # 取得先URL 8num_pages = 40 # 取得ページ数 9request_interval = 1 # ページ取得間隔 10 11data = [] 12for i in range(0, num_pages + 1): 13 url = urllib.parse.urljoin(url, '?page=0'+str(i)) 14 print('getting page... ', url) 15 html = urllib.request.urlopen(url).read() 16 soup = BeautifulSoup(html, 'html.parser') 17 18for item_elems in soup.select('div.list-item-wrapper'): 19 # 年代、走行距離 20 li_elems = item_elems.select('ul.features > li') 21 year = li_elems[0].text.replace('Year: ', '') # 年代 22 km = li_elems[1].text.replace('Kilometers: ', '') # 走行距離 23 # メーカー、種類 24 breads = item_elems.select('p.breadcrumbs')[0].text 25 breads = [s.replace('\u202a', '').strip() for s in breads.split('>')] # \u202a は消す 26 maker = breads[1] 27 car_type = breads[2] 28 # 値段 29 price_elem = item_elems.select('div.price')[0] 30 price = price_elem.text.replace(',', '').replace('AED', '').strip() # , と AED は消す 31 # リンク 32 a_elem = item_elems.select('h3 a')[0] 33 car_url = urllib.parse.urljoin(url, a_elem.get('href')) 34 title = a_elem.text.strip() 35 36 data.append({ 37 'year': year, 38 'km': km, 39 'maker': maker, 40 'type': car_type, 41 'price': price, 42 'title': title, 43 'url': car_url 44 }) 45 46 47with open('output.csv', 'w') as f: 48 # 列の出力順序を規定 49 fields = ['title', 'url', 'maker', 'type', 'year', 'km', 'price'] 50 51 writer = csv.DictWriter(f, fieldnames=fields, quoting=csv.QUOTE_NONNUMERIC) 52 writer.writeheader() # ヘッダー出力 53 writer.writerows(data) # データ出力
何卒宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/12 04:44