使用Scrapy框架爬取yande图站图片

链接在最后

已完成:

爬取yande首页(或指定标签)多页中的图片大图链接,并存储到json中

空白链接的解决

其他图片信息的提取

图片的存储

待完成:

数据库的存储(MySQL、MongoDB等)

多线程、多进程、代理等其他优化

 

 

目前遇到并解决的一些问题:

0、初次运行scrapy crawl yandes

报错,没有安装win32api,但pip install win32api无效

需要输入:pip install pypiwin32

1、robots协议设置,需要在settings中设置

    (仅供学习交流,实际使用中请遵循robots协议)

ROBOTSTXT_OBEY = False

2、items中默认首字母为大写,在主文件中Import时要注意

3、在pipelines中初始化json时,要使用二进制格式

self.filename = open("yande.json", "wb+")

4、yande的大图链接位于小图下方的横条上

每一个li对应一张图的所有信息,注意一个li下面有多个a,因此要注明class

for each in response.xpath('//li'):
    item = YandeItem()
    item['imgurl'] = each.xpath('./a[@class="directlink largeimg"]/@href').extract()
    yield item

但是这样操作下来,保存了大量空白url(每页均有)

可以添加个len语句去判断是否为空白(这里用图片链接是否存在来判断):

for each in response.xpath('//ul/li'):
    if len(each.xpath('./a[@class="directlink largeimg"]/@href').extract())>0:
        item = YandeItem()

这样解决了存在大量空白项的问题,也是因为这些空白元素,导致使用extract()[0]的时候发生超出索引报错

但为什么会产生这些空白,原因还没有搞清楚。

5、引入图片存储模块后,初次运行报错:No module named 'PIL'

解决:需要安装Pillow包(python3),pip install Pillow

6、图片下载默认读取的url名称为image_urls,当爬取这个信息的时候直接将链接保存为这个名字,便不需要在Imagepipeine模块中做任何修改,否则需要继承该类进行修改。

修改方法参考:https://blog.csdn.net/qq_41781877/article/details/80631942

7、json均能存储每一页的全部图片信息,但通常执行一次程序只能保存6张左右的图片。考虑因为网络卡顿造成的链接超时(毕竟是外国的图站)。因此不建议一次爬取过多页面。(或者选择爬取小图的链接或者采取代理等方式)

执行了3遍才爬下来一页的这么点。。

8、最后在windows下居然不会上传整个文件夹到github。。贴个教程

https://blog.csdn.net/geerniya/article/details/79552247

 

最后附上github地址:

https://github.com/yj4869/scrapy_yande.git

 

你可能感兴趣的:(Python学习)