scrapy实例(pipeline保存数据的各种错误)

scrapy实例一

——cqupthub 寒假任务二

这次最主要的问题就是,pipeline中的数据保存
全部代码见文末哦~
欢迎指正~

任务说明

在这里插入图片描述
目标网站:http://jyzx.beibei.gov.cn/cqbbwz/002/002001/002001004/

爬取内容:
在这里插入图片描述
框完才发现自己基本都框上了,嘻嘻嘻。

爬取步骤

1、先解析主网页,找到所有中标公示的url
2、再对应每个中标公示的url进行爬取
3、用正则进行提取
4、传输数据,通过字典键值对,从spider到pipeline,再保存下来

解析主网页部分(parse函数)

首先我尝试用urllib.request库进行爬取,结果什么都没爬到

于是学长让我抓包试试(然鹅我还并不会,fiddler还不怎么会用)
问了超级善良的小伙伴,他让我找这个aspx。没错,就是它。
在这里插入图片描述
所以,我就在这个页面中爬了呀
在这里插入图片描述

通过 .find_all(“a”),找到所有a标签,在找到其href属性
这样,我们就可以进入子网页了

解析子网页 (parse_proj函数)

  1. 北碚县区的项目,有的是表格形式,有的是图片形式
    所以我们先判断子网页是什么形式
    这里,我通过判断是否有某个标签,来判断是下载图片,还是爬表格
  2. 下载图片的话,就要找到图片的链接,然后下到本地
  3. 如果是附件的话,就提取附件链接
  4. 爬表格就是各种正则了

pipeline保存数据

这里遇到的问题们
  1. 在保存为csv格式这里,卡了很久,不知道怎么操作
问题一(item内容错误)

首先,是报错Item does not support field: XXX
在这里插入图片描述
然后我找到自己代码中的这一块
在这里插入图片描述

于是我换了一个键值对试试
然后我发现它换了一个键错误,后来我想到,是我键值对的键,赋值的是中文,不是item里面的
去掉num_key这一行,再直接infoDict[“num_key”] = num_val,就没问题了
是我智障了

问题二(文件写入的w or wb)

写入时是选择w而不是wb

问题三(写入后有乱码)

在这里插入图片描述
于是我进行调试
在这里插入图片描述
这里的infoDict也没问题,不过name_key这里为空,一会还要改一下正则

然后我想到上面正确的列数和下面乱码的列数不一样,我想到自己在pipeline这里,有些键没有写,于是我把所有键都都写了
于是列数是一样的了,但是下面还是有这么多行乱码。
大胆猜测是pipeline写入的函数不对

在这里插入图片描述
于是,我注释掉这一句就没问题了

问题四(start_urls的类型)

我加上翻页后,发现爬不到
在这里插入图片描述
但是我尝试另外写一个用requests的函数,直接找链接,是可以的,于是猜测,是start_urls这里的问题,但是它又必须是列表类型
在这里插入图片描述
于是我换成这样就可以了
在这里插入图片描述

问题五(去掉附件形式)

现在还有一个问题,就是有的网页是下载文件,我需要把这种情况去掉
在这里插入图片描述
调试了很久,终于尝试出,这样去除
在这里插入图片描述

瞎扯扯

有同学没有爬取表格,而是直接把网页截图下来,保存截图
我问他是怎么想到的,他说,看见右键后有个打印选项,于是他就试试,发现,其实是通过截图,转换成pdf,然后打印
于是,他就通过selenium来截图
绝对是一波sao操作 啊!

最后附上代码吧

spider 部分

import scrapy
import re
from bs4 import BeautifulSoup
import urllib
from county_gov.items import CountyGovItem
import pdb


class BeibeiSpider(scrapy.Spider):
    name = 'beibei'

    # 这里是翻页
    start_urls = []
    for i in range(1, 43):
        start_urls.append('http://jyzx.beibei.gov.cn/cqbbwz/showmain/zbgsmore.aspx?Paging=' + str(i))

    # 解析主页面的函数
        def parse(self, response):
            contents = response.body
            contents = contents.decode("utf-8")
            # pdb.set_trace()  # 没问题
            soup = BeautifulSoup(contents, "lxml")

            for i in soup.find_all("a"):
                try:
                    url_left = i["href"]
                    url = <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simone Zeng

给作者来杯咖啡吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值