rules = (
Rule(LinkExtractor(allow=r'bizhi/'), callback='parse_item', follow=True),
Rule(LinkExtractor(tags=['img'],attrs='src'), callback='download_jpg',follow=False),
)
def download_jpg(self,response):
id=uuid4().hex
print(id,'============')
print(response.url)
#这么写,download_jpg里面没有打印
1.通过修改scrapy源代码调试,LinkExtractor可以提取到img里的src,然后就没有后续了,download_jpg没有被调用
进展:
2.在下载中间件中做一个一个判断,发现并没有对图片链接进行请求
3继续debug
from scrapy.http import HtmlResponse
from scrapy.linkextractors import LinkExtractor
html='''
<!--example2.html-->
<!DOCTYPE html>
<html>
<head>
<title>LinkExtractor</title>
<script type="text/javascript" src="/js/app1.js"></script>
<script type="text/javascript" src="/js/app2.js"></script>
</head>
<body>
<a href="/home.html">主页</a>
<a href="123">文档</a>
<a href="http://www.baidu.com">文档</a>
<a href="javascript:goToPage('/example.html');return false">案例
<img src='https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/01/0E/ChMkJ1bKwaWIUfSeAAJDsi1Sfm4AALGbgL0AN0AAkPK796.jpg'>
</a>
<a href='https://desk-fd.zol-img.com.cn/t_s960x600c5/g5/M00/01/0F/ChMkJlbKwkmIbK9VAA57yR1wmZgAALGlgIeBm8ADnvh330.jpg'></a>
</body>
</html>
'''
response= HtmlResponse(url='http://example1.com', body=html.encode(), encoding='utf-8')
le = LinkExtractor(tags='a')
le.extract_links(response)
通过构造response,然后构造LinkExtrctor对象,发现href以 .jpg 结尾时,链接不会被抽取,改成 .jp 就可以提取了,说白了,有代码在根据链接的后缀过滤链接
在scrapy源文件下搜索 .jpg 最后定位到scrapy.linkextractor里面的_init_.py
很明显,忽略的扩展,就是忽略的后缀名。然后回到LinkExtractor的构造函数,有一个一直没注意的参数deny_extensions,就是忽略链接后缀的意思,随便给一个不含.jpg的列表['mp4'],就可以抓取图片了
Rule(LinkExtractor(restrict_css='#bigImg',deny_extensions=['mp4'],tags=['img'],attrs='src'), callback='download_jpg', follow=False),
答案就在linkextracor的构造参数里,谁能知道这地方有坑