2020
07/02
15:00
你的位置:首页 > 操作眉目 > 用Scrapy框架开发的一个爬虫项目

用Scrapy框架开发的一个爬虫项目

发布时间:2020-07-02 15:00:54

原标题:用Scrapy框架开发的一个爬虫项目

  干吗要单独开这么着一篇漫笔,主要还是夫妻电视剧播放在网上贷款一分钟到账篇漫笔"一个小爬虫的整体解决方案英文翻译"(https://www.cnblogs.com/qinyulin/p/13219838.html)中没有着重介绍Scrapy,包括末端几天也对代码做了Review,优胜了一些性能,倍感还是夫妻电视剧播放相应把小我的劳动成果打个标,也怕末端要求的自考成绩啥时候出来记不住,所以还是夫妻电视剧播放老实的写一篇漫笔用来记录。话不多说,上干货。

  Scrapy框架,我的理解就是在Spider中请求url。在其一请求过程中,我们会用到中间件软件。用来要挟网络请求,对请求Request展开一些头部信息,然后在返回对象Response中也可以做一些处理,把获取到的网页,穿越bs4解析竹签元素。转包换小我要求的信息,当谋取信息的自考成绩啥时候出来。可以把移动号百信息包费装成对象,穿越pipe管道展开数据理清,然后再展开数据存储(可以存本土文件,也可以调用API存数据库),具体的规律可以参考下面的链接https://blog.csdn.net/qq_34120459/article/details/86711728,不过在实用主义做的过程当中。我一次性要对此产品的评论爬成千上万条,而且同时针对性挫折后的断点吉他谱续爬,所以我就放弃了数据管道清洗方式,把所有的业务o2o商城的财务逻辑都放在Spider之内展开。由此看来,这样做有悖于Scrapy的数据扭转规律,只是没办法,和诸多人交换过,相似目前的方式足足是可行的。

       首届来一个爬虫Spider的代码缩略图: 

       images/loading.gif' data-original="https://img2020.cnblogs.com/blog/80354/202007/80354-20200702112814619-1480578389.jpg" width="919" height="1036" loading="lazy">

 

  这里的Init函数主要是用来做一些初始化职业。详细代码如下:

 1  #初始化函数 2  def __init__(self,saveType=1): 3   self.keywords = []#基本词java数组了局 4   self.totalObj = {}#所有基本词双色球开奖结果查询的对象 5   # self.over = True #其一卫星参数临时性没用,观察了之后可以删除 6   self.startTime = time.strftime("%b_%d_%Y_%H_%M_%S", time.localtime()) #开始时间,用来写字json文件名中包含违规内容 7   self.saveType = saveType#源泉类型。用来区别是自行还是夫妻电视剧播放自行 8   self.Count = 10000#定义每个Asin爬取的最大评论额数 9   self.resCount = 0#最终发送给孵卵器的请求条数10   self.getCount = 0#用来计算keywords的索引是否完成了所有查询,老是成功之后索引+111   self.successArr = []#成功发送的Asinjava数组了局12   self.loseArr = []#挫折发送的Asinjava数组了局13 14   #########下面的代码是用来智取事先的评论数据,老是完成之后会吧数据留存其一JSON文件之内,倘然中途中断下次会智取网上贷款一分钟到账次的数据。15   review_list_file = open("data/review_detail_crawler_all.json","w+")16   self.review_list = review_list_file.readlines()

  

  跟手进入入口函数start_requests,因为我在爬虫的自考成绩啥时候出来要求定位到US,所以先模拟了一个表单请求。然后setSession和getAsinKeywords都是从孵卵器拿数据并展开处理,这里是小我的业务代码就不贴了。

 1  #爬虫入口函数  2  def start_requests(self): 3   data = { 4    "locationType":"LOCATION_INPUT", 5    "zipCode": "10001", 6    "storeContext": "hpc", 7    "deviceType": "web", 8    "pageType": "Detail", 9    "actionSource": "glow",10   }11   yield scrapy.FormRequest("https://www.amazon.com/gp/delivery/ajax/address-change.html", method="POST",formdata=data, headers={'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},dont_filter=True, callback=self.setSession,errback=self.ceshi)

   

  主要说一下parse_post_data其一函数,主要是根据获取到的网页信息,格式化并变更竹签树,穿越bs4插件谋取数据,注释写得比较不可磨灭了。代码如下:

 1  #成功回调函数,率先判明是否被封。倘然被封就调用Tor代理更替IP,倘然没被封就跟着解析。 2  def parse_post_data(self, response): 3   asin = response.meta["asin"] 4   title = BeautifulSoup(response.text, 'l').title 5   title = title.string if not title is None else "" 6   if "Robot Check" in title: 7    print("IP被封了Spider") 8    yield from self.renew_connection(asin) 9   else:10     #抓取该单品从开卖到现在的所有 Review11     dom = BeautifulSoup(response.text, 'l')12     try:13      #获取到评论列表14      ids = dom.find(id="cm_cr-review_list").select(".review")15      #倘然评论列表长短为0则说明爬完了。16      if len(ids) == 0:17       self.totalObj[asin]["over"] = True18       logger.warning("{}没有下一页终止爬取数据".format(asin))19      #循环往复获取到的评论列表,支取数据。因为是第一次做。之内获取的了局有点杂,20      #因为有太多未知的域名解析错误,所以用了try了局来赋值,之内的卫星参数没注释,可以结合API看。21      for id in ids:22       if self.totalObj[asin]["over"] == True or len(self.totalObj[asin]["list"]) >= self.Count:23        break24       obj = {}25       obj["page"] = self.totalObj[asin]["pageNumber"]26       obj["reviewId"] = id.attrs["id"]27       28       obj["title"] = id.select(29        ".review-title span:first-child")[0].string30       obj["username"] = id.select(".a-profile-name")[0].string31       obj["content"] = id.select(".review-text-content")[0].get_text()32       try:33        obj["reviewDate"] = id.select(".review-date")[0].get_text()34       except Exception as e:35        obj["reviewDate"] = ""36       37       try:38        obj["voteNum"] = 0 if not len(id.select(".cr-vote-text")) else id.select(".cr-vote-text")[0].string39       except Exception as e:40        obj["voteNum"] = 041       try:42        obj["score"] = id.select(".a-icon-alt")[0].string43       except Exception as e:44        obj["score"] = 045       46       #倘然赶上reviewId评论,说明事先现已爬取过,就把当前的over状态置为True47       if obj["reviewId"] == self.totalObj[asin]["reviewId"]:48        self.totalObj[asin]["over"] = True49        logger.warning("{}返回reviewId终止爬取{}".format(asin,obj["reviewId"]))50       else:51        self.totalObj[asin]["list"].append(obj)52       print(obj)53       pass54     except Exception as e:55      pass56     #上面是解析了当前页面的数据,下面的代码是用来判明是否爬完。57     try:58      #这里是用来判明当前Asin评论的总页码59      if self.totalObj[asin]["totalStr"] == "":60       try:61        totalStr = dom.select("#filter-info-section .a-size-base")[0].string62        self.totalObj[asin]["totalStr"] = totalStr63       except Exception as e:64        pass65      else:66       totalStr = self.totalObj[asin]["totalStr"]67      #totalStr示范:Showing 1-20 of 2,442 reviews68      countArr = totalStr.split(' ')69      fNum = countArr[1].split('-')[1]#当前额数2070      tNum = countArr[3]#总额数244271      #倘然当前额数大于相当总额数,表示现已爬完。72      if int(fNum.replace(",","")) >= self.Count:73       self.totalObj[asin]["over"] = True74       logger.warning("{}大于{}条数据终止爬取".format(asin,self.Count))75      if fNum == tNum:76       #结尾一页,把当前asin的了结标志置为True77       self.totalObj[asin]["over"] = True78       logger.warning("{}结尾一页{}终止爬取数据".format(asin,fNum))79      print("这是{}第{}页".format(asin,self.totalObj[asin]["pageNumber"]))80      #防止log信息太多,10条录入一次。81      if self.totalObj[asin]["pageNumber"] % 10 == 0:82       logger.warning("这是{}第{}页".format(asin,self.totalObj[asin]["pageNumber"]))83     except Exception as e:84      pass85     86     #倘然当前Asin的over为false,说明没有赶上reviewId和还有下一页,则把当前Asin的页码加1延续爬。87     if self.totalObj[asin]["over"] == False:88      self.totalObj[asin]["pageNumber"] += 189      yield from self.getViewForAsin(asin)90     else:91      #倘然当前Asin的over为True,说明当前Asin现已爬完,把当前Asin的数据发送到孵卵器,92      #而且根据keywordsjava数组了局展开下一个Asin的爬取,倘然爬取Asin的长短大于相当keywords长短。93      #说明从头至尾爬取过程现已完成,不展开所有操作。进入close流程翻译。94      logger.warning("{}完成了一次请求。打算发送数据.".format(asin))95      yield from self.sendSingelData(asin)96      97      self.getCount += 198      if self.getCount <= len(self.keywords) - 1:99       yield from self.getViewForAsin(self.keywords[self.getCount])

  

  结尾就是close函数的代码:

 1  #爬虫闭合的钓黄鳝的钩子怎么做函数 2  def close(self, reason, spider): 3   # 打开公共设立文件。智取search_asin_index值,并智取对应的search_asin_index文件的文本格式,转包换java数组了局并组合成发送的数据 4   if self.resCount == len(self.keywords): 5    logger.warning("全部产品的评论发送完成,共发送{}次".format(self.resCount)) 6   else: 7    logger.warning("此次爬虫未全部爬完数据,共发送{}次".format(self.resCount)) 8   logger.warning("成功的产品有{}".format(self.successArr)) 9   logger.warning("挫折的产品有{}".format(self.loseArr))10   self.file = open('data/review_detail_crawler_all.json'.format(self.startTime,time.strftime("%H_%M_%S", time.localtime())), 'wb')11   self.file.write(json.dumps(self.totalObj).encode())12   self.file.close()13   pass


  在确定用Scrapy框架事先,我也是去心得了一把requests库和selenium,requests的话做一些简单的爬虫需求还是夫妻电视剧播放可以,不能经常化;selenium的话主要还是夫妻电视剧播放穿越模拟储户繁殖行为来展开数据的爬取。主要用于年轻化测试的场景。在一些要求复杂操作的爬虫还是夫妻电视剧播放可以的,只是倘然用在大面积爬取项目是非常耗时的,所以我最终还是夫妻电视剧播放求同求异了Scrapy框架。而且在期终因为要频繁爬取。容易触发德国亚马逊的反爬策略,所以又研究了Tor网络,其一是用来隐藏孵卵器IP,穿越代理去展开爬虫请求,其一从最终的代码量见兔顾犬其实不大。只是在研究的过程也是备受折腾。因为在百分百成功事先的每一步都是在反思干吗不行。从谋取需求到熟悉框架,到结尾完成上线。然后再review优胜代码差不离1个月时间,破例是最开始在亮堂了框架的规律,只是却不能解决小我的需求反复去寻求解决方案英文翻译是最难过的,不过当在一次次试错后找到结尾的解决方案英文翻译,还是夫妻电视剧播放很有成就感是什么意思。

  其实Scrapy的东西还诸多,我用到的只是没有倘然矮小的片段,希望在末端有迭代需求的自考成绩啥时候出来可以再延续研究,下面贴出项目意料之中用什么然到的一些名词和对应的网址,也希望观望这篇文章的同伙倘然在研究Scrapy赶上长江联合登陆问题,可以展开留恋或者私信交换,艺无止境,我们一直在旅途。

Python教程(我推荐廖雪峰的):https://www.liaoxuefeng.com/wiki/1016959663602400

Scrapy官网:https://scrapy.org/

requests:https://requests.readthedocs.io/en/master/

基础爬虫+selenium教程(我就是看着这位同伙的连下载的门):https://www.cnblogs.com/Albert-Lee/p/6238866.html

bs4:https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

tor:

  linux本子:https://medium.com/@mimizhang55555/%E5%9C%A8scrapy%E4%B8%AD%E4%BD%BF%E7%94%A8tor%E4%BB%A3%E7%90%86-20a0f07c14b2

  win本子:https://www.cnblogs.com/kylinlin/archive/2016/03/04/5242266.html

 

 

原标题:用Scrapy框架开发的一个爬虫项目

基本词:

转载请保留本文网址: http://www.www.d5897.com/a/462566.html
*破例声明:以上内容来自于网络编采,著作权属性质原作者所有,如有侵权,请联系我们: admin#www.d5897.com (#包换@)。
您可能性感感兴趣的文章
Baidu