为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2023-04-11 16:28:03
所以基本上它在我第一次运行蜘蛛时出于某种原因起作用了,但之后它只抓取了一个 URL。-我的程序正在抓取我想从列表中删除的部分。- 将零件列表转换为文件中的 URL。- 运行并获取我想要的数据并将其输入到 csv 文件中。问题:仅从一个 URL 获取输出不知道从这里去哪里 我检查了其他资源并尝试制作 start_request。结果还是一样。所以基本上我怎样才能让它使用所有的 start_urls 并遍历它们中的每一个而不仅仅是最后一个?这是蜘蛛:import csvimport xlrdimport scrapywb = 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'
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

现在,通过执行日志我可以告诉你蜘蛛中有两个问题,似乎都与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。


如果这解决了您的问题,请告诉我。


查看完整回答
反对 回复 2023-04-11
  • 1 回答
  • 0 关注
  • 100 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信