crawl spider /spider

2018-08-03  本文已影响21人  仙灵儿

一:Scrap Shell

运行在终端的工具,用来调试scrapy。可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式。

简单使用—糗事百科

scrapy shell  “http://www.baidu.com/

scrapy shell -s USER_AGENT='Mozilla/5.0'

fetch(‘url’)

A-response对象

属性

text:字符串格式的html

body:二进制格式的html

url:所请求的url

status:响应的状态码

方法:

xpath(): 根据xpath路径获取符合的路径所有selector对象

(是scrapy内部封装的一个类的对象)的列表

              例:获取糗事百科用户名

    response.xpath('//div[@class="author clearfix"]//img/@alt')

css():获取符合要求的所有selector对象的列表

获取内容

name_list=response.css('#content-left a > h2::text')

获取属性 

css_list=response.css('#content-left a > img::attr(src)')

接着extract()即可一般不使用,

因为中间scrapy会将这个选择器给翻译成xpath再去解析

selector对象

xpath('./'): 从当前节点向下开始查找 

css(): 和上面的response的方式一样

extract(): 将对象转化为unicode字符串

extract_first(): 如果xpath没有获取到内容,

extract_first()会返回None,extract()会报错

B-item对象

类字典对象,用法和字典一模一样

将这个对象转化为字典  stu = dict(stu)

二: yield item和请求

yield 示例-1

2-校花网  http://www.xiaohuar.com/hua/ 

【温馨提示】写好pipeline的时候,需要在settings文件中打开一个配置

ITEM_PIPELINES = {

  'huaproject.pipelines.HuaprojectPipeline': 300,

    }

第一个:处理的管道

第二个:优先级,越小优先级越高(1-1000)

*****************************************************************

   实现单个页面图片下载

多页面抓取

url规律

第一页 list-1-0.html

第二页 list-1-1.html

第n页 list-1-(n-1).html

三:请求传参(高级请求)

假如一个页面不能将一个item的所有信息全部拿到,

需要再次发送一次请求,再次解析才能将item的所有信息拿到。

电影天堂  http://www.dytt8.net/

一:crawl spider 

CrawlSpider是一个类,父类是scrapy.Spider。

CrawlSpider不仅有Spider的功能,还有自己独特功能

特有功能:CrawlSpider可以定义规则,解析html时可根据链接规则

提取出指定链接,然后再向这些链接发送请求。

通常用于:如果有需要跟进链接的需求,爬取网页之后,需要提取链接再次爬取。

  如何提取链接?

链接提取器,在这里就可以写规则提取指定链接

scrapy.linkextractors.LinkExtractor(

    allow = (),    # 正则表达式  提取符合正则的链接

    deny = (),     # (不用)正则表达式  不提取符合正则的链接

  allow_domains = (),  # (不用)允许的域名

    deny_domains = (),   # (不用)不允许的域名

    restrict_xpaths = (), # xpath,提取符合xpath规则的链接

    retrict_css = ()  # 提取符合选择器规则的链接)

【案例】:电影天堂-提取所有页码链接

scrapy shell http://www.dytt8.net/html/gndy/dyzz/index.html

from scrapy.linkextractors import LinkExtractor

正则用法

links1 = LinkExtractor(allow='list_23_\d+\.html')

links1.extract_links(response) 查看提取到的所有链接

------------------------------------------------------------------------

    xpath用法

links2 = LinkExtractor(restrict_xpaths='//div[@class="x"]')

【注意】这里的xpath不带a

css用法

links3 = LinkExtractor(restrict_css='.x') 【注意】这里的选择器不带a

     【案例】:读书网-散文随笔

https://www.dushu.com/book/1163.html 

scrapy startproject readbook1

scrapy genspider -t crawl readbook www.dushu.com

     crawlspider运行原理:

【实操-spiders注意说明】

rules = (Rule(LinkExtractor(allow=r'/book/1163_\d+\.html')

, callback='parse_item', follow=False),)

   【注1】callback只能写函数名字符串, callback='parse_item'

   【注2】在基本的spider中,如果重新发送请求,那里的callback写的是   callback=self.parse_item

*********************************************************************

二:日志信息和日志等级

级别:

CRITICAL:严重错误

ERROR:一般错误

WARNING:警告

INFO: 一般信息

DEBUG:调试信息

默认的级别为DEBUG,会显示上面所有的信息

在配置文件中  settings.py设置

LOG_LEVEL : 设置日志显示等级,此举动决定了显示哪些,不显示哪些

LOG_FILE  : 将屏幕显示的信息记录到文件中,屏幕不再显示

三:Request和response总结

Request(类)

get请求

scrapy.Request(url=url,callback=self.parse_item,meta={'item':item}, headers=headers)

url: 要请求的地址

callback:响应成功之后的回调函数

meta: 参数传递

headers: 定制头信息,一般不用

response(对象)

response.text: 字符串格式文本

response.body: 二进制格式文本

response.url: 当前响应的url地址

response.status: 状态码

response.xpath(): 筛选想要的数据

response.css(): 筛选想要的数据

post请求

【温馨提示】

如果直接发送post请求,start_urls和parse方法就用不到

因为重写了start_requests(self)这个方法,

【案例】:百度翻译

scrapy.FormRequest(url=url, headers=headers, callback=self.parse_item

, formdata=data)

url: 要发送的post地址

headers:定制头信息

callback: 回调函数

formdata: post所携带的数据【字典】

四:代理

通过下载中间件来进行添加

(1)到settings.py中,打开一个选项

DOWNLOADER_MIDDLEWARES配置选项

(2)到middlewares.py中找到以下方法写代码

def process_request(self, request, spider):

     request.meta['proxy'] = 'https://113.68.202.99:8888'

       return None

   ------------------------------------------------------------------------

五:scrapy实现模拟登录

【案例】豆瓣-douban

https://accounts.douban.com/login 

【温馨提示】

Douban基于安全考虑-比较靠谱的网站,登录时需携带Cookie。

所以需要首先向登录地址发送get请求,然后再向post地址发送post请求,因为中间要携带cookie,才能登录成功

请求模式【get==>post==>get】

六:存储到mysql中

   【案例】-读书项目

from scrapy.utils.project import get_project_settings

settings = get_project_settings()

*********************************************************************

上一篇下一篇

猜你喜欢

热点阅读