【问题标题】:Yield items with scrapy使用scrapy生成项目
【发布时间】:2020-04-23 08:18:08
【问题描述】:

我的蜘蛛出现问题,我设置它的方式似乎不起作用。蜘蛛应该能够在同一个网站上抓取多个页面(1,2,3)。我不确定是否应该执行 for 循环或 if/else 语句以便提取所有数据? 运行后我得到此代码:爬取 0 页(以 0 页/分钟),抓取 0 项(以 0 项/分钟)。

任何帮助将不胜感激!

下面显示的是蜘蛛、items.py 和 pipelines.py 的代码:

class abcSpider(scrapy.Spider):
name = 'abc'
page_number = 2
allowed_domains = ['']

def parse(self, response):

    items = folder1Item()

    deal_number_var = response.css(".mclbEl a::text").extract()
    deal_type_var = response.css('.#ContentContainer1_ctl00_Content_ListCtrl1_LB1_VDTBL .mclbEl:nth-child(9)').css('::text').extract()


    items['deal_number_var'] = deal_number_var
    items['deal_type_var'] = deal_type_var
    yield items

    next_page = '' + str(abcSpider.page_number) + '/'
    if abcSpider.page_number < 8:
        abcSpider.page_number += 1
        yield response.follow(next_page, callback=self.parse)

这是我的 items.py 页面:

import scrapy

class folder1Item(scrapy.Item):
deal_number_var = scrapy.Field()
deal_type_var = scrapy.Field()

我想将数据保存为 .db 文件以导入 sqlite3。在我的 pipelines.py 中看起来像这样:

import sqlite3

class folder1Pipeline(object):

def __init__(self):
    self.create_connection()
    self.create_table()

def create_connection(self):
    self.conn = sqlite3.connect("abc.db")
    self.curr = self.conn.cursor()

def create_table(self):
    self.curr.execute("""DROP TABLE IF EXISTS abc_tb""")
    self.curr.execute("""create table abc_tb(deal_number_var text, deal_type_var text)""")

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

def store_db(self,items):
    self.curr.execute("""insert into abc_tb values (?,?,?)""" , (items['deal_number_var'][0], items['deal_type_var'][0]))
    self.conn.commit()

Middleware.py 代码:

from scrapy.http import HtmlResponse
from selenium import webdriver

class JSMiddleware(object):
def process_request(self, request, spider):
    driver = webdriver.PhantomJS()
    driver.get(request.url)

    body = driver.page_source
    return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)

【问题讨论】:

    标签: python scrapy


    【解决方案1】:

    我认为这是您的全部代码?如果是这样:您没有定义任何start_urls。此外,您要么必须正确设置 allowed_domains,要么完全删除变量,因为现在您定义不允许使用任何 url。

    【讨论】:

    • 首先感谢您的回复!要访问我想抓取的页面,我必须登录,这就是我使用 Selenium 浏览所有这些步骤的原因。现在我正试图将它与scrapy联系起来。我已经用我的 middleware.py 脚本更新了我的代码......我不完全确定如何将处理后的 HTML 链接重定向到我的蜘蛛,然后正确设置“项目”部分。你知道如何解决这个问题吗?
    • 就我个人而言,我会尝试使用 scrapys 内置方法来处理登录(FormRequest.from_response),请参阅here 获取官方文档或here 获取完整示例。所以将start_urls设置为登录页面,利用FormRequest.from_response-method处理登录,然后开始抓取。同样,请确保正确设置 allowed_domains 或删除变量,否则它将不起作用。
    • 是的,我想过把它全部改成Scrapy,只是当我通过登录页面访问该页面时,我必须点击很多下拉菜单并添加一些变量,其中“driver.find_element_xpath”帮助了我......你有关于如何连接两个抓取工具的任何提示吗?再次感谢您的回复!
    • 您所描述的内容实际上听起来很适合单独使用 Scrapy。除非涉及大量 AJAX 调用和 JavaScript,否则 Selenium 可能很有用。没有结合 Scrapy 和 Selenium 的个人经验,但如果您更喜欢结合这两种工具,请查看 thisthis。你也可以看看scrapy-splash 和这个scrapy middleware
    猜你喜欢
    • 2014-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多