【scrapy爬取不到tbody的问题以及保存数据为json格式】

在使用Scrapy爬虫时遇到tbody元素无法抓取的问题,原因在于tbody是浏览器自动添加的,实际响应HTML中并不存在。解决方法是删除xpath中的tbody部分。此外,分享了Scrapy的XPath使用经验,强调在循环中避免使用绝对路径,并介绍了如何通过Chrome获取XPath。同时,文章提到了Scrapy保存数据为JSON格式的pipeline,注意JSON文件中数据结构的组织,并讨论了模拟登录、设置爬取间隔等反爬策略。

scrapy用xpath爬取不到tbody的问题

这是因为tbody是Firefox和Chrome等浏览器自动添加的标记。
但是当使用Scrapy进行抓取时,tbody不在responseHTML中。

所以我们只要把xpath里的tbody删除即可正常爬取的数据
把tbody删除即可
顺便写点scrapy的经验吧, 进入循环的xpath语句记得前面没有/这些东西, 直接按节点走,例如:第一个for循环是对末尾的div数组进行遍历, 然后第二层循环是对div数组里的div[2]/div/div[]数组进行遍历, 注意xpath格式。

for l in response.xpath('/html/body/div[4]/div/div'):
             for x in l.xpath('div[2]/div/div'):

xpth可以通过F12->复制->复制xpath很方便的得到。


这里spider虽然没用到但是参数必须加上否则会报错

保存数据为save.json格式的pipeline

class Test1Pipeline:

    def __init__(self):
        self.file = codecs.open('save.json', 'w+', encoding='utf-8')

    def open_spider(self, spider):
        self.file.write('[\n')

    def process_item(self, item, spider):
        # # 读取item中的数据
        # line = json.dumps(item, ensure_ascii=False) + '\n'
        line = json.dumps(dict(item), ensure_ascii=False)
        self.file.write('\t' + line + ',\n')
        return item

    def close_spider(self, spider):
        #定位到最后一个多余的逗号
        self.file.seek(-2, os.SEEK_END)
        #删除逗号及后面的东西
        self.file.truncate()
        #加上换行和]
        self.file.write('\n]')
        #关闭
        self.file.close()

注意json只能有一对{}, 多个{}可以放入list保存

可以通过设置具体响应头, 模拟登录, 使用池设置爬取间隔等方式来避免反爬

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值