回答大家关于Scrapy学习中的问题。
一、关于response
response就是请求返回的响应。作为parse()
方法的参数。
def parse(self, response):
官方文档中的说明:
提取数据
现在,我们来尝试从这些页面中提取些有用的数据。
您可以在终端中输入 response.body
来观察HTML源码并确定合适的XPath表达式。不过,这任务非常无聊且不易。您可以考虑使用Firefox的Firebug扩展来使得工作更为轻松。详情请参考 使用Firebug进行爬取 和 借助Firefox来爬取 。
response对象的类型:scrapy.http.response.html.HtmlResponse
使用python的requests
html = requests.get(url).content
那response就相当于上面返回的html
在parse()
方法中就可使用XPath来对页面值进行提取。
二、Spider中URL的获取
- start_urls 是Spider待爬取的URL
注意,这里start_urls不要拼写错误,不是start_url - Spider中初始的request通过调用 start_requests() 来获取的。
自定义的Spider中没有start_requests() 方法时,就是读取的start_url中的url值。
start_requests()
方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。我们重写start_requests()
方法,一般用来作登录,包含登录的信息或cookies。主要是在parse
方法前要做些事情。下面的代码就是以Cookie的方式来登录。
def start_requests(self):
url = 'http://www.jianshu.com/collections/V2CqjW/collection_submissions.json?state=&page=1'
return [FormRequest(url,cookies=self.cookies,callback=self.parse)]
三、Spider要抓取多个页面数据完成对象的抓取
注意:Spider中是没有设置抓取方法有返回值的,也就是如果在一个页面抓取数据,不是调用另一个方法返回其他数据后,一起提交(yield)
而是需要在第一个页面抓取数据后,带到下一个页面再进处抓到,最后数据一起yield,处理是一个流式的。
通过meta
来传递参数。
yield Request(url,self.parse_article,meta={'item':item})
具体可参见这篇文章:Scrapy抓取在不同级别Request之间传递参数