x42j网卡驱动,阿诺德,劲歌金曲颁奖礼
对于用户来说,spider是最核心的组件,scrapy爬虫开发是围绕实现spider展开的。
request和response是http协议中的术语,即http请求和http响应,scrapy框架中定义了相应的request和response类,这里的item代表spider从页面中爬取的一项数据。
request对象用来描述一个http请求,下面是其构造器方法的参数列表。
request(url, callback=none, method='get', headers=none, body=none, cookies=none, meta=none, encoding='utf-8', priority=0, dont_filter=false, errback=none, flags=none) # url(必选):请求页面的url地址,bytes或str类型,如'http://www.baidu.com'。 # callback:页面解析函数, callable类型,request对象请求的页面下载完成后,由该参数指定的页面解析函数被调用。如果未传递该参数,默认调用spider的parse方法。 # method:http请求的方法,默认为'get'。 # headers:http请求的头部字典,dict类型,例如{'accept':'text/html', 'user-agent':mozilla/5.0'}。如果其中某项的值为none,就表示不发送该项http头部,例如{'cookie':none},禁止发送cookie。 # body:http请求的正文,bytes或str类型。 # cookies:cookie信息字典,dict类型,例如{'currency': 'usd','country': 'uy'}。 # meta:request的元数据字典,dict类型,用于给框架中其他组件传递信息,比如中间件item pipeline。其他组件可以使用request对象的meta属性访问该元数据字典(request.meta),也用于给响应处理函数传递信息,
# 详见response的meta属性。 # encoding:url和body参数的编码默认为'utf-8'。如果传入的url或body参数是str类型,就使用该参数进行编码。 # priority:请求的优先级默认值为0,优先级高的请求优先下载。 # dont_filter:默认情况下(dont_filter=false),对同一个url地址多次提交下载请求,后面的请求会被去重过滤器过滤(避免重复下载)。如果将该参数置为true,可以使请求避免被过滤,强制下载。例如,在多次爬取
# 一个内容随时间而变化的页面时(每次使用相同的url),可以将该参数置为true。 # errback:请求出现异常或者出现http错误时(如404页面不存在)的回调函数。
虽然参数很多,但除了url参数外,其他都带有默认值。在构造request对象时,通常我们只需传递一个url参数或再加一个callback参数,其他使用默认值即可。
response对象用来描述一个http响应,response只是一个基类,根据响应内容的不同有如下子类:
当一个页面下载完成时,下载器依据http响应头部中的content-type信息创建某个response的子类对象。我们通常爬取的网页,其内容是html文本,创建的便是htmlresponse对象,其中htmlresponse和xmlresponse是textresponse的子类。实际上,这3个子类只有细微的差别,这里以htmlresponse为例进行讲解。
下面是htmlresponse对象的属性及方法。
url:http响应的url地址,str类型。 status:http响应的状态码,int类型,例如200,404。 headers:http响应的头头部,类字典类型,可以调用get或getlist方法对其进行访问,例如:response.headers.get('content-type') response.headers.getlist('set-cookie') body:http响应正文,bytes类型。 text:文本形式的http响应正文,str类型,它是由response.body使用response.encoding解码得到的,即reponse.text = response.body.decode(response.encoding) encoding:http响应正文的编码,它的值可能是从http响应头部或正文中解析出来的。 request:产生该http响应的request对象。 meta:即response.request.meta,在构造request对象时,可将要传递给响应处理函数的信息通过meta参数传入;响应处理函数处理响应时,通过response.meta将信息取出。 selector:selector对象用于在response中提取数据。 xpath(query):使用xpath选择器在response中提取数据,实际上它是response.selector.xpath方法的快捷方式。 css(query):使用css选择器在response中提取数据,实际上它是response.selector.css方法的快捷方式。 urljoin(url):用于构造绝对url。当传入的url参数是一个相对地址时,根据response.url计算出相应的绝对url。例如: response.url为http://www.example.com/a,url为b/,调用response.urljoin(url)的结果为http://www.example.com/a/b/。
虽然htmlresponse对象有很多属性,但最常用的是以下的3个方法:
前两个方法用于提取数据,后一个方法用于构造绝对url。
实现一个spider子类的过程很像是完成一系列填空题,scrapy框架提出以下问题让用户在spider子类中作答:
实现一个spider只需要完成下面4个步骤:
scrapy.spider基类实现了以下内容:
关于起始url start_urls:
start_urls通常被实现成一个列表,其中放入所有起始爬取点的url(例子中只有一个起始点)。看到这里,大家可能会想,请求页面下载不是一定要提交request对象么?而我们仅定义了url列表,是谁
暗中构造并提交了相应的request对象呢?
由此我们知道request对象是调用基类start_requests方法产生的,因此我们也可以自己定义start_requests方法(覆盖基类spider的start_requests方法),直接构造并提交起始爬取点的request对象。在某些场景下使用这种方式更加灵活,例如有时想为request添加特定的http请求头部,或想为request指定特定的页面解析函数。
页面解析函数也就是构造request对象时通过callback参数指定的回调函数(或默认的parse方法)。页面解析函数是实现spider中最核心的部分,它需要完成以下两项工作:
一个页面中可能包含多项数据以及多个链接,因此页面解析函数被要求返回一个可迭代对象(通常被实现成一个生成器函数),每次迭代返回一项数据(item或字典)或一个request对象。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Python 实现将numpy中的nan和inf,nan替换成对应的均值
python爬虫把url链接编码成gbk2312格式过程解析
网友评论