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
하지만,이 때문에 재 지정 또는 기타 물건의 변경 될 수 있습니다, 그래서 수 :
덕분에
start_url
매개 변수로item['start_url']
를 전달하는 파이프 라인을 업데이트해야합니다. 그것은 완벽하게 작동했습니다! – SDailey