SCRAPY_part2_基础TIPS

创建一个新的Scrapy项目

  • 在想放代码的地方 运行scrapy startproject project_name
  • 一些基本的属性和方法

    • name:标识爬虫名字。它在项目中必须是唯一的,不能为不同的爬虫设置相同的名称。

    • start_requests():必须返回一个迭代的 Requests (可以返回一个列表或者写一个生成器函数),Spider将开始抓取这些 requests 。随后的 requests 将从这些初始 requests 中连续生成。

    • parse(self, response):将被调用来处理为每个 requests 下载的 response 的方法。 response 参数是TextResponse的一个实例,它包含页面内容,并有更多有用的方法来处理它。parse()方法通常解析response ,提取被爬到的数据作为字典,同时寻找新的URL,并从中创建新的请求(Request)。

    • scrapy.Request(url , callback) : 接受从 url 返回的 response 。并将 response 实例化 。传递给callback 当参数。

    • start_urls =[]: 只定义 start_urls (存放URL的列表)。和 parse() 回调方法. Scrapy 会默认用 start_requests()初始化这些url 。然后默认的调用 parse() 处理。

      (调用parse()方法来处理这些URL的每个请求,即使我们没有明确告诉Scrapy这样做。发生这种情况是因为parse()是Scrapy的默认回调方法,对于没有显式分配回调的请求调用。)

运行

  • 在project的根目录(有scrapy.cfg的地方) 运行 scrapy crawl spider_name 运行爬虫

提取数据(CSS选择器)

  • 启动 Scrapy shell scrapy shell 'http://quotes.toscrape.com/page/1/'(记得网址加引号。WINDOW加双引号。否则 后面的参数带&就不起作用)

  • CSS选择器

    response.css('title')
    [<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]
    
    #返回的是  list-like object. called SelectorList 
    
    response.css('title::text').extract()
    ['Quotes to Scrape']
    
    # 用 extract()提取具体的信息  注意css是选择。extract()是提取。如果只用CSS()不管选择的多细返回的都是list-like object对象 如上面。需要用 extract() 提取具体的信息
    
    
    # extract()虽然提取具体信息但还是一个list 比如 ['Quotes to Scrape'] 如果需要直接提取比如 STRING 用extract_first() 提取第一个结果(一般选择到位都是一个吧)
    
    
    #或用 response.css('title::text')[0].extract() == response.css('title::text').extract_first()  (最好用extract_first()避免发生错误)
    
    
    # example
    
    response .css("div.quote")
    response.css("small.author::text").extract_first()
    response.css("div.tags a.tag::text").extract() #注意空格
    response.css('.author + a::attr(href)') #选择 author class后的 a标签。必须在同一级
    
    #正则提取
    
    response.css('title::text').re(r'Quotes.*')
    ['Quotes to Scrape']
    response.css('title::text').re(r'Q\w+')
    ['Quotes']
    response.css('title::text').re(r'(\w+) to (\w+)')
    ['Quotes', 'Scrape']

    为了找到合适的CSS选择器来使用,你可能会发现使用view(response)方法在你的web浏览器的shell中打开 response 页面是很有用的。您可以使用 browser developer tools 或Firebug扩展(请参阅关于使用Firebug进行爬虫使用Firefox进行爬虫的部分)。

    Selector Gadget也是一个很好的工具,可以快速找到可供选择的元素的CSS选择器,这在许多浏览器中都可以使用。

除了CSS,Scrapy选择器也支持使用XPath表达式:

 response.xpath('//title')
[<Selector xpath='//title' data='<title>Quotes to Scrape</title>'>]

 response.xpath('//title/text()').extract_first()
'Quotes to Scrape'

using XPath with Scrapy Selectors here.
this tutorial to learn XPath through examples
this tutorial to learn “how to think in XPath

使用命令行导出爬取的数据

scrapy crawl quotes -o quotes.json 用 -o。因为历史原因如果重复导出同名文件会追加在上一个文件的末尾而不是覆盖

在小型项目(如本教程中的)中,这应该足够了。但是,如果要使用爬取的项目执行更复杂的事情,可以编写一个 Item Pipeline。 Item Pipeline的占位符文件已经在创建项目时在 project / pipelines.py中为您设置。尽管如果你只是想存储刮取的物品,你不需要实现任何物品管道。

递归寻找链接

next_page=response.css('li.next a::attr(href)').extract_first() #提取网址
>>> '/page/2/'
 if next_page is not 
     next_page = response.urljoin(next_page) #urljoinbuqu补全绝对路径
     yield scrapy.Request(next_page, callback=self.parse) #调用自己

#用response.follow替代scrapy.Request 
if next_page is not None:
      yield response.follow(next_page, callback=self.parse)#不需要补全绝对路径

# 对于<a>元素有一个快捷方式:response.follow自动使用他们的href属性。
for a in response.css('li.next a'):
    yield response.follow(a, callback=self.parse)

默认情况下,Scrapy会将重复请求过滤到已经访问过的URL,避免因编程错误而导致服务器过多的问题。这可以通过设置DUPEFILTER_CLASS进行配置。

使用 命令行参数代入爬虫

scrapy crawl quotes -o quotes-humor.json -a tag=humor 用-a 传递参数 这里 self.tag=humor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Scrapy Redis是一个用于分布式爬取网页的Python框架。它是基于Scrapy框架的扩展,采用Redis作为分布式队列,可以在多个爬虫节点之间共享任务和数据。通过引入scrapy_redis.spider文件中的RedisSpider类,可以将原来继承的scrapy.Spider类改为RedisSpider类,从而实现对分布式爬虫的支持。 在使用分布式爬虫的过程中,首先需要将项目配置为分布式,并将项目拷贝到多台服务器中。然后启动所有的爬虫项目,这样每个爬虫节点都可以独立运行。接下来,在主redis-cli中使用lpush命令将需要爬取的网址推送到Redis队列中。这样,所有的爬虫节点都会开始运行,同时获取不同的任务和数据,实现分布式爬取的效果。 要使用Scrapy Redis进行分布式爬取,首先需要安装scrapy_redis包。可以通过在CMD工具中执行命令"pip install scrapy_redis"来进行安装。安装完成后,就可以在项目中使用scrapy_redis进行分布式爬取了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Scrapy基于scrapy_redis实现分布式爬虫部署](https://blog.csdn.net/baoshuowl/article/details/79701303)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值