Scrapy学习问题解答之一

回答大家关于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的获取

  1. start_urls 是Spider待爬取的URL
    注意,这里start_urls不要拼写错误,不是start_url
  2. 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之间传递参数

点赞