应课程需要写了几天爬虫,一开始使用requests+bs4的技术路线,但是速度不是很理想而且不能暂停,通过查阅资料,发现scrapy正是我需要的

做一下简短的记录:

首先应该毫不犹豫的scrapy startproject  gnspider;scrapy genspider gnspider http://www.chinanews.com;

然后定义items文件,写下我们希望爬虫下载的内容

紧接着去测试gnspider能否请求到网页

gnspider的写法

 class GnspiderSpider(scrapy.Spider):

   name = “gnspider”

   #从seed页开始,放入start_urls = []

   #seed页很多,则可以在def start_requests(self):重定义scrapy.Request(url),并返回由其组成的请求列表,即retuen [scrapy.Request(url),scrapy.Request(url),.....]

   def parse(self,response):

     #response是我们需要的网页的响应,我们通过css选择器或者xpath进行定位标签元素,这一步是最关键的,快速定位是必须的
     response.css("div.content_list ul li div.dd_bt a::attr(href)").extract() #由于本科时了解过css,这里二话不说就用cssSelector,extract()是为了提取内容,结束提取则extract(),未结束则接着找标签。     response.css("div.left_zw p::text").extract()     content_list=response.xpath('//div[@id=\"artibody\"]/p/text()').extract()     big_urls=sel.xpath('//div[@id=\"tab01\"]/div/h3/a/@href').extract()    #'http://news.sina.com.cn/guide'
    big_titles=sel.xpath("//div[@id=\"tab01\"]/div/h3/a/text()").extract()
    second_urls =sel.xpath('//div[@id=\"tab01\"]/div/ul/li/a/@href').extract()
    second_titles=sel.xpath('//div[@id=\"tab01\"]/div/ul/li/a/text()').extract()     divs = response.xpath("//div[@id='J_ItemList']/div[@class='product']/div")     div.xpath("p[@class='productPrice']/em/@title")[0].extract()     div.xpath("p[@class='productTitle']/a/@title")[0].extract()     div.xpath("p[@class='productTitle']/a/@href")[0].extract()          item["SHOP_NAME"] = div.xpath("li[1]/div/a/text()")[0].extract()
    item["SHOP_URL"] = div.xpath("li[1]/div/a/@href")[0].extract()
    item["COMPANY_NAME"] = div.xpath("li[3]/div/text()")[0].extract().strip()
    item["COMPANY_ADDRESS"] = div.xpath("li[4]/div/text()")[0].extract().strip(     #对于每个链接进行请求,这里我想强调的是meta这个参数,可以帮助我们将一级页面上爬到的内容传递到二级页面上,通过response.meta这个字典进行传递,非常方便我们对item进行组装     for li in lis:       yield scrapy.Request(li,callback = self.parse_detail,meta={"cate":cate})   def parse_detail(self,response): #解析二级页面     #经常我们爬取的是一个列表     str1 = “”.join(lis) #split方法中不带参数时,表示分割所有换行符、制表符、空格。     str1 = replace(" ","").replace("\u3000","")     return item

写gnspider的时候一定不要一口气写完,一定要一个函数一个函数的测,首先保证地址写对了,其次保证标签选对了,最后保证item组装好了,我把它称为爬虫三段式

既然爬到了内容就应该存下来留个纪念,通过pipelines定义存储方式,在这里使用文件存储

class MyspiderPipeline(object):
  # def open_spider(self,spider):#针对爬虫
  # self.f = open('gn.txt','a')   # def close_spider(self,spider):
  # self.f.close()   def process_item(self, item, spider):#针对item
    self.f = open(cate[item["CATEGORY"]] + '.txt','a')    #注意文件操作,防止乱码
    line = str(dict(item)["CONTENT"]) + '\n'
    self.f.write(line)
    self.f.close()
    return item

最后别忘了在配置文件中启用pipelines

总结如下:

简单爬虫三步走,1.定义items,2.parse页面,3.pipelines定义存储方式

其中parse页面又分为三步1.写对网址,2.找到标签,3.组装item

scrapy还提供了暂停功能:开始爬虫时使用命令  scrapy crawl gnspider  -s JOBDIR=supplement/auto

暂停时使用ctrl + c

再次启动时还使用命令  scrapy crawl gnspider -s JOBDIR=supplement/auto

当爬取大量数据时推荐写多个爬虫,同时进行,可使电脑资源发挥最大效果

爬完结束提示信息如下

最新文章

  1. .Net(c#)模拟Http请求之HttpWebRequest封装
  2. 模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A,B,C,D表示,当选某候选人时,直接输入其编号(编号由计算机随机产生,若输入的不是A,B,C,D则视为无效票,选举结束后按得票数从高到底输出候选人编号和所得票数.
  3. 【地图API】收货地址详解2
  4. JNI 学习笔记系列(一)
  5. 2D游戏编程5—锁定频率
  6. 四、Mp3文件类型及其判断
  7. ANSI Common Lisp 中文翻譯版 — ANSI Common Lisp 中文版
  8. XHTML
  9. vagrant扩容
  10. Uva - 810 - A Dicey Problem
  11. 导入另一个 Git库到现有的Git库并保留提交记录
  12. 【server.properties】kafka服务设置
  13. react-router 4 路由的嵌套
  14. shell随笔
  15. Django控制器
  16. Codeforces 505A Mr. Kitayuta's Gift 暴力
  17. org.hibernate.hql.internal.ast.QuerySyntaxExceptionunexpected token: on near line 1
  18. Friends and Berries URAL - 2067 (计算三点共线和计算的时候的注意点)
  19. 【转】如何使用JMeter测试Java项目
  20. 2018中国大学生程序设计竞赛 - 网络选拔赛 1009 - Tree and Permutation 【dfs+树上两点距离和】

热门文章

  1. prefix word se sub suc sup suf sur out~s
  2. python两个字典合并,两个list合并
  3. mybatis-ResultMappingResolver类信息
  4. Five Great .NET Framework 4.5 Features (五大特性)
  5. 验证码 kaptcha 参数详解
  6. Cracking The Coding Interview 5.5
  7. Cracking The Coding Interview 3.5
  8. Android system :led_class驱动
  9. linux 清空文件
  10. 内存布局:栈,堆,BSS段(静态区),代码段,数据段