2016-03-20 5 views
0

Ich entwickle gerade einen Web - Crawler, der durch eine Liste von URLs arbeitet, die ich in einer Warteschlangendatei gespeichert habe. Ich brauche meinen Spider, um alle Wörter von diesen URL - Seiten zu scrappen, bevor er auf den nächsten Link in der Warteschlange, ich brauche einen Punkt in der richtigen Richtung für die Einrichtung, so dass Web Scraper im Vergleich zu meiner common.txt, um sicherzustellen, dass das Wort nicht da ist und wenn es nicht bereits in der Liste vor dem Hinzufügen etc.Web scraping wordlists

ich so etwas wie dies mit GET_KEYWORDS in meinem spider.py versucht hatte, aber es tut nichts ich einfach etwas fehlen kann, wie ich den ganzen Tag Codierung habe aber trotzdem hier ist mein Code

Spider.py

from Gen_info import * 


class Spider: 

    project_name = '' 
    queue_file = '' 
    crawled_file = '' 
    keyword_file = '' 
    queue = set() 
    crawled = set() 

    def __init__(self, project_name): 
     Spider.project_name = project_name 
     Spider.queue_file = Spider.project_name + '/Chrome_Hist.csv' 
     Spider.crawled_file = Spider.project_name + '/CrawledUrls.txt' 
     self.boot() 
     #self.crawl_page('First spider', Spider.queue) 

    # Creates directory and files for project on first run and starts the spider 
    @staticmethod 
    def boot(): 
     create_project_dir(Spider.project_name) 
     create_files(Spider.project_name) 
     Spider.queue = file_to_set(Spider.queue_file) 
     Spider.crawled = file_to_set(Spider.crawled_file) 

    # Updates user display, fills queue and updates files 
    @staticmethod 
    def crawl_page(thread_name, page_url): 
     if page_url not in Spider.crawled: 
      print(thread_name + ' now crawling ' + page_url) 
      print('Queue ' + str(len(Spider.queue)) + ' | Crawled ' + str(len(Spider.crawled))) 
      Spider.queue.remove(page_url) 
      Spider.crawled.add(page_url) 
      Spider.update_files() 


    @staticmethod 
    def update_files(): 
     set_to_file(Spider.queue, Spider.queue_file) 
     set_to_file(Spider.crawled, Spider.crawled_file) 



    @staticmethod 
    def get_keywords(Page_words): 
     common = open("Common_words.txt").read().split('\n') 
     word_dict = {} 
     word_list = Page_words.lower().split() 
     for word in word_list: 
      if word not in common and word.isalnum(): 
       if word not in word_dict: 
        word_dict[word] = 1 
       if word in word_dict: 
        word_dict[word] += 1 

main.py

import threading 
from Queue import Queue 
from Spider import Spider 
from Gen_info import * 
import urllib2 
from bs4 import BeautifulSoup 
from shutil import copyfile 
import os 


PROJECT_NAME = 'History Forensics' 
QUEUE_FILE = PROJECT_NAME + '/Chrome_Hist.csv' 
CRAWLED_FILE = PROJECT_NAME + '/CrawledUrls.txt' 
NUMBER_OF_THREADS = 2 
Queue = Queue() 
Spider(PROJECT_NAME) 
keywords = '' 



src = 'C:\Users\Lewis Collins\Python Project\ChromeDBs\Chrome_Hist.csv' 
dst = PROJECT_NAME 

path = 'C:\Users\Lewis Collins\Python Project\ChromeDBs\Chrome_Hist.csv' 

# Create worker threads (will die when main exits) 
def create_workers(): 
    for _ in range(NUMBER_OF_THREADS): 
     t = threading.Thread(target=work) 
     t.daemon = True 
     t.start() 


# Do the next job in the queue 
def work(): 
    while True: 
     url = Queue.get() 
     Spider.crawl_page(threading.current_thread().name, url) 
     Queue.task_done() 


# Each queued link is a new job 
def create_jobs(): 
    for link in file_to_set(QUEUE_FILE): 
     Queue.put(link) 
    Queue.join() 
    crawl() 


# Check if there are items in the queue, if so crawl them 
def crawl(): 
    queued_links = file_to_set(QUEUE_FILE) 
    if len(queued_links) > 0: 
     print(str(len(queued_links)) + ' links in the queue') 
     create_jobs() 

def get_keywords(): 



     common_words = open('File_Storage/common.txt', 'r').readlines() 
     keywords=open(PROJECT_NAME + '/keywords.txt', 'r').read().split('\n') 
     f = open(PROJECT_NAME + '/keywords.txt', 'a') 
     urls = file_to_set(QUEUE_FILE) 
     Hist_queue = urls 
     for i in Hist_queue: 
      html_content = urllib2.urlopen(i).read() 
      soup = BeautifulSoup(html_content) 
      for script in soup(["script", "style"]): 
       script.extract() 
      text = soup.get_text() 
      lines = (line.strip() for line in text.splitlines()) 
      chunks = (phrase.strip() for line in lines for phrase in line.split(" ")) 
      text = '\n'.join(chunk for chunk in chunks if chunk) 
      (text.encode('utf-8')) 
      visible_text = soup.getText() 
      words = visible_text.split(' ') 
      for word in words: 
       if word not in common_words and word not in keywords and word.isalnum(): 
        f.write(word + '\n') 
        keywords.append(word) 
       else: 
         continue 






#copyfile(src, dst) 
# 

# os.remove(path) 
create_workers() 
get_keywords() 
crawl() 

Haben Sie Fragen zu, wie es funktioniert Feuer weg oder andere Code, den Sie können

Dank im Voraus jeder

+0

Wenn Sie sehen wollen müssen url einfach zu verarbeiten. Entnehmen Sie den Thread-Code und führen Sie ihn sequenziell aus. Es sei denn, ich habe deine Anforderung missverstanden. Oder haben Sie ein Flag, um auf 1 Thread auf einmal beschränken (Anzahl der Threads) –

+0

der Web-Crawler selbst ist in Ordnung und läuft durch zum Beispiel Ich werde 5 URL in meine Warteschlange-Datei dann auf Spinnenfäden setzen sie besuchen URL dann entferne es und lege es in crawled.txt, aber ich muss es irgendwie bekommen, damit es die Webseite analysiert und Wörter von der URL nimmt, bevor es zur nächsten URL geht. –

+0

Wenn jemand in dieser Situation stecken bleibt, werde ich mit meiner Lösung bearbeiten –

Antwort

0
def get_keywords(): 



     common_words = open('File_Storage/common.txt', 'r').readlines() 
     keywords=open(PROJECT_NAME + '/keywords.txt', 'r').read().split('\n') 
     f = open(PROJECT_NAME + '/keywords.txt', 'a') 
     urls = file_to_set(QUEUE_FILE) 
     Hist_queue = urls 
     for i in Hist_queue: 
      html_content = urllib2.urlopen(i).read() 
      soup = BeautifulSoup(html_content) 
      for script in soup(["script", "style"]): 
       script.extract() 
      text = soup.get_text() 
      lines = (line.strip() for line in text.splitlines()) 
      chunks = (phrase.strip() for line in lines for phrase in line.split(" ")) 
      text = '\n'.join(chunk for chunk in chunks if chunk) 
      (text.encode('utf-8')) 
      visible_text = soup.getText() 
      words = visible_text.split(' ') 
      for word in words: 
       if word not in common_words and word not in keywords and word.isalnum(): 
        f.write(word + '\n') 
        keywords.append(word) 
       else: 
         continue