麦克引擎 SCRAPY 下载百度图片踩坑记

忙了一上午各种采坑,才把百度图片保存下来。搞得我一肚子火,写出来让大家少踩点坑。

为了我的麦克引擎,我决定去百度上把所有的狗狗照片重新收集一遍。

其实之前kaggle提供了很多的照片,但是这些照片……


问题1:无关人员太多。问题2:狗狗的图片数量太少。问题3:没有足够多的种类。

总之,我决定了,重新自己收集图片,自己整理学习数据集合。这就像教孩子学习,想要教好他,就要给他足够好的知识,显然我不想让他认识画面中那些人,只想让他认识狗,所谓狗不如人,跑题了。

1.目标 把百度上的图片存下来


做这种事儿,那肯定是scrapy啊。

上scrapy大法,正好之前写过一个爬取头条数据的。什么?ajax渲染,反爬取?不存在的,上selenium+chrome,直接开一个浏览器读取html并渲染,然后抓取渲染完成的body分析。

把之前的代码整理了一下跑起来。


很快数据出来,我当时很乐观,我认为这点事儿,肯定10分钟搞定了。然后我开始了我的踩坑之旅。

踩坑1.scrapy的下载中间件

class jsPageMiddleware(object):
    stime = 2
    downtime = 1
    def process_request(self, request, spider):
        chromedriver = "C:/Users/mayn/AppData/Local/Google/Chrome/Application/chromedriver.exe"
        browser = webdriver.Chrome(chromedriver)
        browser.get(request.url)
        browser.refresh()
        #browser.send_keys(Keys.DOWN)
        #通过按向下键将页面滚动条拖到底部  
        for i in range(self.downtime):
            #browser.find_element_by_xpath("//*[@id='wrapper_wrapper']").send_keys(Keys.DOWN)
            ActionChains(browser).send_keys(Keys.PAGE_DOWN).perform()
            time.sleep(1) 
       
        time.sleep(self.stime)
        body = browser.page_source
        return HtmlResponse(browser.current_url, body=body, encoding='utf-8', request=request)

为了躲避所谓的js渲染问题,我用了selenium来加载页面,然后构建新的response返回。

可是这玩意是挡在任何请求前面的,也就是说其实我是希望只在spider时用这个中间件,真正下载时不打开这个浏览器。

结果下载图片是开了n个窗口,每个窗口还是430 forbidden。

这个难受啊。

决定去研究一下 spider middle


先看的一个scrapy中文文档,结果对于这句话死活不明白,到底是调用之前还是之后?


只好去翻英文,终于明白是在调用spider的parse方法前调用该方法。

什么?只能返回None或者exception。我tnnd就是想改变response好让spider能分析js渲染过的html,你tnnd不让我更改response,要你何用?算了不让返回response,我更改传递进来的response吧。我是不想改变response,你tnnd倒是提供一个解决js渲染的方案啊,我自己想方案你又说不能这样用…

我很天真的写了一行:

response.body = body

很自然的,报错了,我去查了查,原来scrapy爸爸是这样教我做人的:

我很天真的用了replace,果然不行。


然后看到baba说了一句话,感情你是创建了一个新对象。我要的是改变一下里面的值。(可能我水平太凹)总之这条路我放弃了。

我不写Spider中间件了还不行!?

我重新回去看看下载中间件吧。

灵光一现,发现请求jpg就不处理呗。


判断后缀,如果是jpg不处理。

采坑2.430 forbidden

图片在浏览器中看起来都ok,一用才发现满屏的430 forbidden,百度爸爸教做人啊。

又研究了半小时,原来就是


headers必须增加两个东西。


老年人的手速和学习能力,加上各种坑,坑的我快吐血了,本来我就是想下载一个图片而已,结果一上午愉快的过去了。


这就是结果,一堆图片,而且还有很多不是affenpinscher的,哎。

这种感觉就像是本来就是想1分钟过河,结果花了一年的时间建了一座桥。过了河,发现好像来错地方了……

我想呐喊,想骂人,最后冷静下来还是写了一篇博文……

猜你喜欢

转载自blog.csdn.net/dunelfree/article/details/79971683