忙了一上午各种采坑,才把百度图片保存下来。搞得我一肚子火,写出来让大家少踩点坑。
为了我的麦克引擎,我决定去百度上把所有的狗狗照片重新收集一遍。
其实之前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分钟过河,结果花了一年的时间建了一座桥。过了河,发现好像来错地方了……
我想呐喊,想骂人,最后冷静下来还是写了一篇博文……