-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtopla.py
173 lines (128 loc) · 4.88 KB
/
topla.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import requests
import codecs
import csv
import sys
if sys.version_info[0] >= 3:
unicode = str
from htmlmin.minify import html_minify
from requests.exceptions import RequestException
from contextlib import closing
from bs4 import BeautifulSoup
#proxies = {'http': 'http://89.105.202.101:3128/'}
def simple_get(url):
"""
GET isteği yaparak url almaya çalışır.
Yanıt HTML veya XML ise, içeriğini döndürür.
Aksi halde None döner.
"""
try:
#with closing(requests.get(url, stream=True, proxies=proxies)) as resp:
with closing(requests.get(url, stream=True)) as resp:
if is_good_response(resp):
return resp.content
else:
return None
except RequestException as e:
log_error('{0} için yapılan istekte hata döndü: {1}'.format(url, str(e)))
return None
def is_good_response(resp):
#Yanıt HTML ise True, aksi takdirde False döndürür.
content_type = resp.headers['Content-Type'].lower()
return (resp.status_code == 200
and content_type is not None
and content_type.find('html') > -1)
def log_error(e):
#Hataları kaydeder.
print(e)
domain = 'https://www.sikayetvar.com'
brand_names = ['marka1','marka-2'] #Markalar ['marka1','marka2',...] urlde nasıl geçiyorsa o şekilde yazılır
scraped_data = []
for brand in brand_names:
brand_url = domain + '/' + brand
brand_source = simple_get(brand_url)
brand_soup = BeautifulSoup(html_minify(brand_source), 'html.parser')
pagination = brand_soup.find('section',{'class':'pagination row'})
sikayet_no =0
"""
Markaya ait sayfa sayısının tespiti:
İlk sayfanın değeri 0'dır.
Eğer pagination değeri varsa +1 eklenir.
"""
if pagination != None:
num_of_pages = pagination.find_all('a')
page_numbs = []
for page_no in num_of_pages:
page_numbs.append(page_no.text)
last_page_no = int(page_numbs[-2])+1
else:
last_page_no = 2
"""
Şikayetleri toplamak için
Sayfalara gidilir
pagination değeri yoksa sayfa sayısına 2 atanır
"""
for x in range(1, last_page_no):
page_num=x
log = '\n '+ brand + ' için ' + str(page_num) + '. sayfa okunuyor...\n'
print(log)
page_source = simple_get(brand_url+'?page='+str(page_num))
page_soup = BeautifulSoup(html_minify(page_source), 'html.parser')
item_pages = []
"""
Her sayfa ziyaret edilir
Sayfalar diziye alınır
"""
for complaint in page_soup.find_all('a', {'class':'complaint-link-for-ads'}):
item_pages.append(complaint['href'])
for page in item_pages:
sikayet_no = sikayet_no + 1
"""
Diziden sayfalar çağırılır
Şikayetler tek tek ziyaret edilir
Şikayet sayfası pars edilir
"""
sikayet_url = domain + page
print('Okunan sayfa: ' + sikayet_url + '...')
sikayet_source = simple_get(sikayet_url)
sikayet_soup = BeautifulSoup(html_minify(sikayet_source), 'html.parser')
"""
İndirilen kaynaktan
İstenen veriler değişkenlere atanır
"""
title = sikayet_soup.find('title')
if title != None:
title = title.text.strip('\n')
title = title.replace(' - Şikayetvar', '')
description = sikayet_soup.find('div', {'class':'description'})
if description != None:
description = description.text.strip('\n')
date = sikayet_soup.find('span',{'class':'date date-tips'})
if date != None:
date = date['title'][:-5]
views = sikayet_soup.find('span',{'class':'view-count-detail'})
if views != None:
views = views.b.text
hashtags = sikayet_soup.find_all('a',{'class':'highlight'})
tags = []
for tag in hashtags:
tags.append(tag['title'])
sikayet_id = 1
row = [sikayet_no,brand,title,description,date,views,tags]
scraped_data.append(row)
"""
row (satır) değişkeninde saklanan veriler
CSV dosyalarına yazdırılır
Marka şikayetleri bittiğinde veriler hafızadan temizlenir
CSV dosyası kaydedilip kapatılır
"""
with open(brand+".csv", "w", newline="") as csvfile:
print('\n'+brand+' Bitti!\n')
writer = csv.writer(csvfile, delimiter=';', quotechar='"')
headers = ['ID','Marka','Başlık','Açıklama','Tarih','Görüntüleme Sayısı','Etiketler']
writer.writerow(headers)
for row in scraped_data:
writer.writerow(row)
scraped_data.clear()
print('Tüm işlemler bitti!')