返回

在Scrapy中检查数据库中是否存在字符串

发布时间:2022-08-21 17:45:49 385
# css# mysql# 数据库# sql# 数据

在将项目发送到数据库之前,是否可以通过特定键(例如,通过 url)检查数据库中是否存在条目。即,在获取产品卡链接列表的阶段,在转到产品卡之前。在我的情况下,需要在def parse中检查数据库中是否有这样的URL,如果有,则跳过(继续),如果没有这样的地址,则转到parse_product...

我的蜘蛛:

class MyCrawlerSpider(scrapy.Spider):
    name = 'my_crawler'

    def start_requests(self):
        
        url = 'https://example'
        yield scrapy.Request(
                url=url, 
                callback=self.parse
                )

    def parse(self, response, **cb_kwargs):
    
        for item in response.css('.lvajR')[:6]:
            url = response.urljoin(item.css('::attr("href")').get())
            if not check_duplicates(url):
                yield scrapy.Request(
                    url=url,
                    callback=self.parse_product)


    def parse_product(self, response):
        items = Items()
        items['url'] = response.url
        yield items


def check_duplicates(url):
    connection = mysql.connector.connect(
        host='xx.xxx.xxx.xxx',
        port=3306,
        user='*************',
        password='***********!',
        database='urls',
    )
    cursor = connection.cursor()
    sqlq = f"SELECT url FROM my_table WHERE url = '{url}'"
    cursor.execute(sqlq)
    results = cursor.fetchone()
    if results == '1':
        return True
    else:
        return False

我的管道。py:

import mysql.connector


class MyCrawlerPipeline(object):

    def __init__(self):
        self.create_connection()
        self.curr = self.conn.cursor()

    def create_connection(self):
        self.conn = mysql.connector.connect(
            host='xx.xxx.xxx.xxx',
            port=3306,
            user='*************',
            password='***********!',
            database='urls',
        )

    def process_item(self, item, spider):
        self.store_db(item)
        return item

    def store_db(self, object):
        self.curr.execute(
            """
            INSERT IGNORE INTO table (url) VALUES (%s)
            """,
            (
                item['url'],
               
            )
        )
        self.conn.commit()

是否可以更优雅地实现这一点,例如,以某种方式注册检查重复项中间件中的功能?

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像