私はスクレイパー用の一般的なスクレーパーを製作しようとしましたが、少しバグがあるようです。そのアイデアは、入力としてURLを取り、特定のURLからのページのみを掻き分けなければならないということです。しかし、それはYouTubeなどのサイトから外に出ているようです。理想的には、1,2 、3などのように、最初のページから遠ざかるような深いリンクの数です。どのようにこれを達成するための任意のアイデア?一般的なスクレーパー
from bs4 import BeautifulSoup
from bs4.element import Comment
import urllib
from route import urls
import pickle
import os
import urllib2
import urlparse
def tag_visible(element):
if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:
return False
if isinstance(element, Comment):
return False
return True
def text_from_html(body):
soup = BeautifulSoup(body, 'html.parser')
texts = soup.findAll(text=True)
visible_texts = filter(tag_visible, texts)
return u" ".join(t.strip() for t in visible_texts)
def getAllUrl(url):
try:
page = urllib2.urlopen(url).read()
except:
return []
urlList = []
try:
soup = BeautifulSoup(page)
soup.prettify()
for anchor in soup.findAll('a', href=True):
if not 'http://' in anchor['href']:
if urlparse.urljoin(url, anchor['href']) not in urlList:
urlList.append(urlparse.urljoin(url, anchor['href']))
else:
if anchor['href'] not in urlList:
urlList.append(anchor['href'])
length = len(urlList)
return urlList
except urllib2.HTTPError, e:
print e
def listAllUrl(url):
urls_new = list(set(url))
return urls_new
count = 0
main_url = str(raw_input('Enter the url : '))
url_split=main_url.split('.',1)
folder_name =url_split[1]
txtfile_split = folder_name.split('.',1)
txtfile_name = txtfile_split[0]
url = getAllUrl(main_url)
urls_new = listAllUrl(url)
os.makedirs('c:/Scrapy/Extracted/'+folder_name+"/")
for url in urls_new:
if url.startswith("http") or url.startswith(" "):
if(main_url == url):
url = url
else:
pass
else:
url = main_url+url
if '#' in url:
new_url = str(url).replace('#','/')
else:
new_url =url
count = count+1
if new_url:
print""+str(count)+">>",new_url
html = urllib.urlopen(new_url).read()
page_text_data=text_from_html(html)
with open("c:/Scrapy/Extracted/"+folder_name+"/"+txtfile_name+".txt", "a") as myfile:
myfile.writelines("\n\n"+new_url.encode('utf-8')+"\n\n"+page_text_data.encode('utf-8'))
path ='c:/Scrapy/Extracted/'+folder_name+"/"
filename ="url"+str(count)+".txt"
with open(os.path.join(path, filename), 'wb') as temp_file:
temp_file.write(page_text_data.encode('utf-8'))
temp_file.close()
else:
pass