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函数)
- 北碚县区的项目,有的是表格形式,有的是图片形式
所以我们先判断子网页是什么形式
这里,我通过判断是否有某个标签,来判断是下载图片,还是爬表格 - 下载图片的话,就要找到图片的链接,然后下到本地
- 如果是附件的话,就提取附件链接
- 爬表格就是各种正则了
pipeline保存数据
这里遇到的问题们
- 在保存为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 = <