如何循环遍历csv文件scrapy中的起始网址

所以基本上它在我第一次运行蜘蛛时出于某种原因起作用了,但之后它只抓取了一个 URL。


-我的程序正在抓取我想从列表中删除的部分。


- 将零件列表转换为文件中的 URL。


- 运行并获取我想要的数据并将其输入到 csv 文件中。


问题:仅从一个 URL 获取输出不知道从这里去哪里 我检查了其他资源并尝试制作 start_request。结果还是一样。


所以基本上我怎样才能让它使用所有的 start_urls 并遍历它们中的每一个而不仅仅是最后一个?


这是蜘蛛:


import csv

import xlrd

import scrapy


wb = xlrd.open_workbook(r'C:\Users\Jatencio\PycharmProjects\testy\test.xlsx')

ws = wb.sheet_by_index(0)

mylist = ws.col_values(0)

print(mylist)


li = []

for el in mylist:

    baseparts = el[:5]

    url1 = 'https://www.digikey.com/products/en/integrated-circuits-ics/memory/774?FV=-8%7C774%2C7%7C1&quantity=0&ColumnSort=0&page=1&k=' + baseparts + '&pageSize=500&pkeyword=' + baseparts

    li.append(url1)

final = list(set(li))



file = open('templist.csv','w+',newline='')

with file:

    write = csv.writer(file, delimiter =',')

    write.writerows(x.split(',') for x in final)


class DigikeSpider(scrapy.Spider):

    name = 'digike'

    allowed_domains = ['digikey.com']

    custom_settings = {

        "USER_AGENT": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"


    }


    with open('templist.csv') as file:

        start_urls = [line.strip() for line in file]


    def parse(self, response):

        data = {}

        parts1 = []

        # parts=response.css('Table#productTable.productTable')

        for p in response.css('tbody#lnkPart > tr'):


            if p.css('td.tr-mfgPartNumber span::text').get() not in mylist:

                continue


            else:

                parts1 = p.css('td.tr-mfgPartNumber span::text').get()


            if p.css('td.tr-minQty.ptable-param span.desktop::text').get():

                quantity = p.css('td.tr-minQty.ptable-param span.desktop::text').get()

                quantity = quantity.strip()

                cleaned_quantity = int(quantity.replace(',', ''))

            else:

                quantity = 'No quantity'


噜噜哒
浏览 112回答 1
1回答

忽然笑

现在,通过执行日志我可以告诉你蜘蛛中有两个问题,似乎都与start_urls.第一个例外:File "C:\Users\Jatencio\PycharmProjects\testy\testdigi\testdigi\spiders\digike.py", line 93, in parse    'Quantity': cleaned_quantity,UnboundLocalError: local variable 'cleaned_quantity' referenced before assignment您在定义它之前引用了它cleaned_quantity。问题在这里:        if p.css('td.tr-minQty.ptable-param span.desktop::text').get():            quantity = p.css('td.tr-minQty.ptable-param span.desktop::text').get()            quantity = quantity.strip()            cleaned_quantity = int(quantity.replace(',', ''))        else:            quantity = 'No quantity'如果您的 if 语句解析为 false,则永远不会定义 cleaned_quantity,并且会在您尝试组装您的项目时引发错误:        yield {            'Part': parts1,            'Quantity': cleaned_quantity,            'Price': cleaned_price,            'Stock': cleaned_stock,            'Status': cleaned_status,        }这只发生在几次迭代中,而不是全部。第二个例外: File "C:\Users\Jatencio\PycharmProjects\testy\testdigi\testdigi\spiders\digike.py", line 55, in parse    p.css('td.tr-mfgPartNumber span::text').remove()[...] File "c:\users\jatencio\pycharmprojects\testy\venv\lib\site-packages\parsel\selector.py", line 371, in remove    raise CannotRemoveElementWithoutRoot(parsel.selector.CannotRemoveElementWithoutRoot: The node you're trying to remove has no root, are you trying to remove a pseudo-element? Try to use 'li' as a selector instead of 'li::text' or '//li' instead of '//li/text()', for example.这里的问题是你.remove()在 parsel 调用伪元素的方法中使用方法,你只能用来从 HTML 树中删除实际元素,所以我相信这应该可以解决问题:改变这个:p.css('td.tr-mfgPartNumber span::text').remove()对此:p.css('td.tr-mfgPartNumber span').remove()您使用该方法的所有行都是这种情况remove。如果这解决了您的问题,请告诉我。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python