zoukankan      html  css  js  c++  java
  • 简单的scrapy实例

    前天实验室的学长要求写一个简单的scrapy工程出来,之前也多少看了点scrapy的知识,但始终没有太明白,刚好趁着这个机会,加深一下对scrapy工作流程的理解。由于临近期末,很多作业要做(其实。。。。。。。。。。。。。。主要还是自己太菜了,嘻嘻),所以决定去搜一个简单的实例模仿一下。

    显示搜了一个爬取腾讯招聘网了例子(https://www.cnblogs.com/xinyangsdut/p/7628770.html),动手敲完之后无法运行,试着调式,也无法解决。就又去找了一个爬取博客园的(https://www.jianshu.com/p/78f0bc64feb8),这个例子只能爬取第一页,稍微改了下,可以爬取任意多个页面。再改的时候,也遇到了一下麻烦。还是对scrapy理解不够(其实。。。。。。。还是自己太菜,流下了无知的眼泪),不过最好总算是顺利完成了。下面,简单的解剖一下这个例子。

    1. 首先是编写item文件,根据爬取的内容,定义爬取字段。代码如下:
      import scrapy
      
      
      class CnblogItem(scrapy.Item):
          # define the fields for your item here like:
          # name = scrapy.Field()
          title = scrapy.Field()  #定义爬取的标题
          link = scrapy.Field()   #定义爬取的连接
    2. 编写spider文件(这是关键),这里命名为cnblog_spider,代码如下:
      # -*- coding: utf-8 -*-
      import scrapy
      from cnblog.items import CnblogItem
      
      
      class CnblogSpiderSpider(scrapy.Spider):
          name = "cnblog_spider"
          allowed_domains = ["cnblogs.com"]
          url = 'https://www.cnblogs.com/sitehome/p/'
          offset = 1
          start_urls = [url+str(offset)]
      
          def parse(self, response):
      
      
              item = CnblogItem()
      
              item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract()       #使用xpath搜索
              item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract()
      
              yield item
      
              print("第{0}页爬取完成".format(self.offset))
              if self.offset < 10:        #爬取到第几页
                  self.offset += 1
              url2 = self.url+str(self.offset)    #拼接url
              print(url2)
              yield scrapy.Request(url=url2, callback=self.parse)

       就这部分代码内容来说,没什么难于理解的,但如果搞明白整个运行流程的话,对理解scrapy有很大的帮助。

    3. 编写pipelines文件,用于把我们爬取到的数据写入TXT文件。
      class FilePipeline(object):
          def process_item(self, item, spider):
      
              data = ''
      
              with open('cnblog.txt', 'a', encoding='utf-8') as f:
                  titles = item['title']
                  links = item['link']
                  for i, j in zip(titles, links):
                      data += i+'     '+j+'
      '
      
                  f.write(data)
                  f.close()
              return item
    4. 更改setting文件
      ROBOTSTXT_OBEY = False          #一定要把这个参数的值更改为Fals
      DEFAULT_REQUEST_HEADERS = {
         'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
         'Accept-Language': 'en',
          #user-agent新添加
          'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
      }
      #新修改
      ITEM_PIPELINES = {
          'cnblog.pipelines.FilePipeline': 300,    #实现保存到txt文件
      
      }
    5. 编写一个main文件,scrapy是不能在编译器里面调试的,但我们可以自己写一个主文件,运行这个主文件就可以像普通的工程一样在编译器里调式了。代码如下
      from scrapy import cmdline
      
      cmdline.execute("scrapy crawl cnblog_spider --nolog".split())       #--nolog是以不显示日志的形式运行,如果需要看详细信息,可以去掉

       现在,我们这个例子就算是写完了,运行main.py,就会生成一个cnblog.Ttxt的文件,里面就是我们爬取下来的内容了。如下图

    最后说一下写这个例子的收获与感想:在敲代码的过程中,发现自己对python一些知识点掌握的还是不够牢固,甚至是while循环一下子都写不出来,以后还是写多点py(别想歪哦)!另外还有一点,有时候真是没压力就没动力,之前学习scrapy时,一直没写出来一个能成功运行的例子,这次在学长的要求下,总算成功写出来了一个。虽然学习之路如此艰难,但绝不应该逃避。加油呀!!!!!

    (ps:本人太菜,若有错误的地方欢迎大佬随时责骂。。。。xixixii)

  • 相关阅读:
    【复习笔记】数据结构-外排序
    【复习笔记】数据结构-内排序
    python os
    pyinstaller problem
    python tk Lable
    机器学习
    python pickle and json
    pycharm 快捷键
    day10_procession作业
    python fibonacci recursion review
  • 原文地址:https://www.cnblogs.com/liangshian/p/10960516.html
Copyright © 2011-2022 走看看