2017-04-13 12 views
1

MySQL 데이터베이스에서 start_urls를 읽고 각 페이지에서 알 수없는 링크를 긁는 거미가 있습니다. pipelines.py를 사용하여 스크랩 된 링크로 데이터베이스를 업데이트하려고하지만 SQL UPDATE 문에 대한 파이프 라인으로 start_url을 다시 가져 오는 방법을 모르겠습니다.각 start_url에 대해 mysql을 업데이트하는 파이프 라인

다음은 작동하는 스파이더 코드입니다. 여기

import scrapy 
import MySQLdb 
import MySQLdb.cursors 
from scrapy.http.request import Request 

from youtubephase2.items import Youtubephase2Item 

class youtubephase2(scrapy.Spider): 
name = 'youtubephase2' 

def start_requests(self): 
    conn = MySQLdb.connect(user='uname', passwd='password', db='YouTubeScrape', host='localhost', charset="utf8", use_unicode=True) 
    cursor = conn.cursor() 
    cursor.execute('SELECT resultURL FROM SearchResults;') 
    rows = cursor.fetchall() 

    for row in rows: 
     if row: 
      yield Request(row[0], self.parse) 
    cursor.close() 

def parse(self, response): 
    for sel in response.xpath('//a[contains(@class, "yt-uix-servicelink")]'): 
     item = Youtubephase2Item() 
     item['pageurl'] = sel.xpath('@href').extract() 
     yield item 

그리고

은 링크가 SQL UPDATE 문에 대한 WHERE 기준으로 START_URL를 사용하여 긁어와 나는 데이터베이스를 업데이트 할 pipeline.py입니다. 그래서 SQL 문에서 start_url은 내가 성취하고자하는 것을위한 자리 표시 자입니다.

import MySQLdb 
import MySQLdb.cursors 
import hashlib 
import re 
from scrapy import log 
from scrapy.exceptions import DropItem 
from twisted.enterprise import adbapi 
from youtubephase2.items import Youtubephase2Item 

class MySQLStorePipeline(object): 
    def __init__(self): 
     self.conn = MySQLdb.connect(user='uname', passwd='password', db='YouTubeScrape', host='localhost', charset="utf8", use_unicode=true) 
     self.cursor = self.conn.cursor() 

def process_item(self, item, spider): 
    try: 

     self.cursor.execute("""UPDATE SearchResults SET PageURL = %s WHERE ResultURL = start_url[ 
        VALUES (%s)""", 
        (item['pageurl'] 
            )) 

     self.conn.commit() 

    except MySQLdb.Error, e: 
     log.msg("Error %d: %s" % (e.args[0], e.args[1])) 

    return item 

제 질문에 대한 답변이 충분합니다. 필자는 과거에 pipeline.py를 사용하여 데이터베이스에 항목을 삽입했습니다. 당신은 또한 response.url을 사용할 수 있습니다, 지금

def start_requests(self): 
    conn = MySQLdb.connect(user='uname', passwd='password', db='YouTubeScrape', host='localhost', charset="utf8", use_unicode=True) 
    cursor = conn.cursor() 
    cursor.execute('SELECT resultURL FROM SearchResults;') 
    rows = cursor.fetchall() 

    for row in rows: 
     if row: 
      yield Request(row[0], self.parse, meta=dict(start_url=row[0])) 
    cursor.close() 

def parse(self, response): 
    for sel in response.xpath('//a[contains(@class, "yt-uix-servicelink")]'): 
     item = Youtubephase2Item() 
     item['pageurl'] = sel.xpath('@href').extract() 
     item['start_url'] = response.meta['start_url'] 
     yield item 

하지만,이 때문에 재 지정 또는 기타 물건의 변경 될 수 있습니다, 그래서 수 :

답변

0

당신은 관련 요청과 항목 간의 관련 정보를 전달하는 meta 요청 매개 변수를 사용할 수 있습니다 나중에 데이터베이스에있는 내용과 다릅니다.

마지막으로, 당신은 또한 빠른 회신에 대한 너무 많은 당신의 cursor.execute

+0

덕분에 start_url 매개 변수로 item['start_url']를 전달하는 파이프 라인을 업데이트해야합니다. 그것은 완벽하게 작동했습니다! – SDailey