python - 我如何使用 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 可以收集数据。因为我可以在终端上查看。
解决方案
确保您的数据库是可访问的,并且您的数据库连接设置(即 mongo URI)是正确的。通常,当数据库无法访问时,您的代码将在重试访问数据库时冻结,直到某种超时,将引发错误。
验证 URI 的一种方法是尝试使用 mongo shell 首先使用相同的 URI 访问数据库:
mongo "mongodb://mongodb0.example.com:28015"
如何使用 mongo shell: https ://docs.mongodb.com/manual/mongo/
推荐阅读
- android - 为什么错误出现在构建中
com.android.build.gradle.tasks.ResourceException: D:\AsmitSharma\Lo
- dart - 在 _MaterialAppState 中找不到路由“主页”的生成器
- marklogic - cts:uri-match 选择特定格式
- php - 使用最新的 Laravel 版本
- scala - CustomMessage 标记内容未在 IntelliJ 中显示
- autocomplete - Flutter TextFormField onChanged 事件
- regex - 如何在正则表达式中输出模式的重复次数?
- java - 检查java中数组数组中元素的相邻元素
- jestjs - 为什么简单的 babel 插件会破坏玩笑测试?
- javascript - 回发时清除 HTML 输入值