需要用scrapy爬取执行js后的网页。
部分scrapy代码:
spider.py:
class Myspider(Spider):
name = 'myspider'
start_url = [....]
...
def parse(self, response):
"""
解析文章列表
"""
urls = response.xpath(....)
for url in urls:
request = Request(url=url, callback=self.parse_post, dont_filter=True)
yield request
def parse_post(self, response):
"""
解析正文
"""
item = myItem()
...
middleware.py:
class PhantomJSMiddleware(object):
@classmethod
def process_request(cls, request, spider):
if request.meta.has_key('PhantomJS'):
try:
driver = webdriver.PhantomJS() # 可能需要指定路径
driver.get(request.url)
content = driver.page_source.encode('utf-8')
url = driver.current_url.encode('utf-8')
driver.quit()
return HtmlResponse(url, encoding='utf-8', body=content, request=request)
except Exception as e:
log.msg('PhantomJS Exception: ' + str(e), level=log.WARNING)
return HtmlResponse(request.url, encoding='utf-8', status=503, body='')
我遇到的问题是:爬虫进入下载器中间件,返回HtmlResponse后,不会再进入解析正文的parse_post函数;但是如果不添加下载器中间件,就可以正常解析正文。
请问下载器中间件该如何编写,才能让返回的response进入parse_post函数
貌似没有在
Response.meta
中设置PhantomJS
, 所以你的process_request
中的if
分支没有走到?动态加载JS我推荐splash