首页 > 解决方案 > 我如何使用 pymongo 在 scrapy 中发送随机用户代理

问题描述

在scrapy中,我想为每个请求发送一个不同的用户代理。所以我在每个请求中都放了 headers:'random user agent'。没有 pymongo,Scrapy 可以正常工作。但是当我用 pymongo 运行它时,它一直冻结。我不知道原因。如果你让我知道就好了。

供参考,使用scrapy-fake-useragent中间件时,不用pymongo也能正常工作,但是和pymongo一起使用时,会继续卡死,所以没用。

此代码工作正常(没有 pymongo)

import scrapy


from faker import Faker
fake = Faker()

class TesterSpider(scrapy.Spider):
    name = 'tester4'
  
    def start_requests(self):
        yield scrapy.Request(url='https://www.amazon.jp', callback=self.router_start, dont_filter=True)

    def router_start(self, response):
        link = ['https://www.amazon.com/s/ref=s9_acss_bw_cts_Computer_T1_w?fst=as%3Aoff&rh=n%3A16225007011%2Cn%3A172456&bbn=16225007011&ie=UTF8&qid=1487012920&rnid=16225007011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=merchandised-search-4&pf_rd_r=PF0Q3FXYDG3N1QMXFA8Y&pf_rd_t=101&pf_rd_p=74069509-93ef-4a3c-8dca-a9e3fa773a64&pf_rd_i=16225007011','https://www.amazon.com/s?bbn=16225007011&rh=n%3A16225007011%2Cn%3A193870011&dc&fst=as%3Aoff&pf_rd_i=16225007011&pf_rd_m=ATVPDKIKX0DER&pf_rd_p=74069509-93ef-4a3c-8dca-a9e3fa773a64&pf_rd_r=PF0Q3FXYDG3N1QMXFA8Y&pf_rd_s=merchandised-search-4&pf_rd_t=101&qid=1487012920&rnid=16225007011&ref=s9_acss_bw_cts_Computer_T2_w','https://www.amazon.com/s?bbn=16225007011&rh=n%3A16225007011%2Cn%3A13896617011&dc&fst=as%3Aoff&pf_rd_i=16225007011&pf_rd_m=ATVPDKIKX0DER&pf_rd_p=74069509-93ef-4a3c-8dca-a9e3fa773a64&pf_rd_r=PF0Q3FXYDG3N1QMXFA8Y&pf_rd_s=merchandised-search-4&pf_rd_t=101&qid=1487012920&rnid=16225007011&ref=s9_acss_bw_cts_Computer_T3_w','https://www.amazon.com/s?bbn=16225007011&rh=n%3A16225007011%2Cn%3A172504&dc&fst=as%3Aoff&pf_rd_i=16225007011&pf_rd_m=ATVPDKIKX0DER&pf_rd_p=74069509-93ef-4a3c-8dca-a9e3fa773a64&pf_rd_r=PF0Q3FXYDG3N1QMXFA8Y&pf_rd_s=merchandised-search-4&pf_rd_t=101&qid=1487012920&rnid=16225007011&ref=s9_acss_bw_cts_Computer_T4_w']
     
  
        for i in link:  
            Faker.seed(fake.random_number())

            yield scrapy.Request(url=i, callback=self.product_1,  priority=200000, dont_filter=True, meta={'link':i},headers={'User-Agent': fake.chrome()})
 
    def product_1(self, response):
        Faker.seed(fake.random_number())
        yield scrapy.Request(url=response.meta['link'] + ' ', callback=self.product, dont_filter=True,headers={'User-Agent': fake.chrome()})


    def product(self, response):

        for i in range(1,10):
            print(i)

但是,这段代码不能很好地工作(使用 pymongo)

import scrapy
import pymongo

connection = pymongo.MongoClient()
db_link = connection.CoupangLinkTestDB  
db_product = connection.CoupangLinkProductTestDB


from faker import Faker
fake = Faker()

class TesterSpider(scrapy.Spider):
    name = 'tester4'
  
    def start_requests(self):
        yield scrapy.Request(url='https://www.amazon.jp', callback=self.router_start, dont_filter=True)

    def router_start(self, response):
         
        db_start = 50
        db_end = 60

        for i in db_link.product_6.find({})[db_start:db_end]:  
            Faker.seed(fake.random_number())

            yield scrapy.Request(url=i['link'], callback=self.product_1,  priority=200000, dont_filter=True, meta={'link':i['link']},headers={'User-Agent': fake.chrome()})
 
    def product_1(self, response):
        Faker.seed(fake.random_number())
        yield scrapy.Request(url=response.meta['link'] + ' ', callback=self.product, dont_filter=True,headers={'User-Agent': fake.chrome()})


    def product(self, response):

        for i in range(1,10):
            print(i)

我在写这个问题之后添加它。

1.如果scrapy-fake-useragent(或faker)不能与pymongo一起工作,scrapy可以收集数据并将其保存到mongodb中。

2.如果scrapy-fake-useragent(或faker)与pymongo一起工作,scrapy无法收集数据。

3.如果scrapy-fake-useragent(或faker)工作,没有pymongo。scrpay 可以收集数据。因为我可以在终端上查看。

标签: pythonmongodbscrapypymongofaker

解决方案


确保您的数据库是可访问的,并且您的数据库连接设置(即 mongo URI)是正确的。通常,当数据库无法访问时,您的代码将在重试访问数据库时冻结,直到某种超时,将引发错误。

验证 URI 的一种方法是尝试使用 mongo shell 首先使用相同的 URI 访问数据库:

mongo "mongodb://mongodb0.example.com:28015"

如何使用 mongo shell: https ://docs.mongodb.com/manual/mongo/


推荐阅读