我再尝试使用scrapy调用gooseeker的api,复现官网给出的爬取房屋信息的例子,结果失败了。经过1天的调试,还是没成功,我发现在在gooseeker浏览器里面是可以获取到数据的,是因为我用的gooseeker代码版本太低了吗。实在不知道什么原因。
  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import os
  4. from urllib import request
  5. from urllib.parse import quote
  6. from lxml import etree

  7. class GsExtractor(object):
  8.     def _init_(self):
  9.         self.xslt = ""
  10.     # 从文件读取xslt
  11.     def setXsltFromFile(self , xsltFilePath):
  12.         file = open(xsltFilePath , 'r' , encoding='UTF-8')
  13.         try:
  14.             self.xslt = file.read()
  15.         finally:
  16.             file.close()
  17.     # 从字符串获得xslt
  18.     def setXsltFromMem(self , xsltStr):
  19.         self.xslt = xsltStr
  20.     # 通过GooSeeker API接口获得xslt
  21.     def setXsltFromAPI(self , APIKey , theme, middle=None, bname=None):
  22.         apiurl = "http://www.gooseeker.com/api/getextractor?key="+ APIKey +"&theme="+quote(theme)
  23.         if (middle):
  24.             apiurl = apiurl + "&middle="+quote(middle)
  25.         if (bname):
  26.             apiurl = apiurl + "&bname="+quote(bname)
  27.         apiconn = request.urlopen(apiurl)
  28.         self.xslt = apiconn.read()
  29.     # 返回当前xslt
  30.     def getXslt(self):
  31.         return self.xslt
  32.     # 提取方法,入参是一个HTML DOM对象,返回是提取结果
  33.     def extract(self , html):
  34.         xslt_root = etree.XML(self.xslt)
  35.         transform = etree.XSLT(xslt_root)
  36.         result_tree = transform(html)
  37.         return result_tree
  38.     # 提取方法,入参是html源码,返回是提取结果
  39.     def extractHTML(self , html):
  40.         doc = etree.HTML(html)
  41.         return self.extract(doc)

  42.   
  43.    
  44. class JobSpider(scrapy.Spider):
  45.     name = 'job'
  46.     allowed_domains = ['anjuke.com']
  47.     start_urls = ['http://bj.zu.anjuke.com/fangyuan/p1']

  48.     def parse(self, response):
  49.         print("----------------------------------------------------------------------------")
  50.         # 引用提取器
  51.         bbsExtra =GsExtractor()
  52.         # 设置xslt抓取规则
  53.         bbsExtra.setXsltFromAPI("31d24931e043e2d5364d03b8ff9cc77e", "安居客_房源")
  54.         # 调用extract方法提取所需内容
  55.         result = bbsExtra.extractHTML(response.body)
  56.         # 打印采集结果
  57.         print(str(result).encode('gbk','ignore').decode('gbk'))
  58.         # 保存采集结果
  59.         file_path = os.getcwd() + "/anjuke-result.xml"
  60.         open(file_path,"wb").write(result)
  61.         # 打印结果存放路径
  62.         print("采集结果文件:" + file_path)<img src="https://www.gooseeker.com/doc/forum.php?mod=image&aid=10175&size=300x300&key=ca32112dd7768643&nocache=yes&type=fixnone" border="0" aid="attachimg_10175" alt="">
复制代码

QQ截图20181016212735.png (55.81 KB, 下载次数: 375)

QQ截图20181016212735.png
举报 使用道具
| 回复

共 5 个关于本帖的回复 最后回复于 2018-10-17 15:31

沙发
szuaudi 中级会员 发表于 2018-10-17 10:54:31 | 只看该作者

RE: 结合scrapy调用API,重现例子失败了

我在本地通过urllib.request是可以获取到结果的。我觉得你应该检查一下这个response.body

GTBD)W`7B5LE{I)}X7_IHP8.png (132.01 KB, 下载次数: 406)

GTBD)W`7B5LE{I)}X7_IHP8.png
举报 使用道具
板凳
13395410370 新手上路 发表于 2018-10-17 12:21:27 | 只看该作者
szuaudi 发表于 2018-10-17 10:54
我在本地通过urllib.request是可以获取到结果的。我觉得你应该检查一下这个response.body
...

你好,感谢回复,方便把代码发一下吗。还有您使用的是样例的规则还是自己定义的规则呢?
举报 使用道具
地板
maohui 中级会员 发表于 2018-10-17 15:00:12 | 只看该作者
13395410370 发表于 2018-10-17 12:21
你好,感谢回复,方便把代码发一下吗。还有您使用的是样例的规则还是自己定义的规则呢? ...

安居客_房源” 这个规则,是你定义的吗?
举报 使用道具
5#
szuaudi 中级会员 发表于 2018-10-17 15:24:43 | 只看该作者
13395410370 发表于 2018-10-17 12:21
你好,感谢回复,方便把代码发一下吗。还有您使用的是样例的规则还是自己定义的规则呢? ...

我使用的你发的api,也就是你的规则
举报 使用道具
6#
szuaudi 中级会员 发表于 2018-10-17 15:31:35 | 只看该作者
13395410370 发表于 2018-10-17 12:21
你好,感谢回复,方便把代码发一下吗。还有您使用的是样例的规则还是自己定义的规则呢? ...
  1. # -*- coding: utf-8 -*-
  2. import os
  3. from urllib import request
  4. from urllib.parse import quote
  5. from lxml import etree

  6. class GsExtractor(object):
  7.     def _init_(self):
  8.         self.xslt = ""
  9.     # 从文件读取xslt
  10.     def setXsltFromFile(self , xsltFilePath):
  11.         file = open(xsltFilePath , 'r' , encoding='UTF-8')
  12.         try:
  13.             self.xslt = file.read()
  14.         finally:
  15.             file.close()
  16.     # 从字符串获得xslt
  17.     def setXsltFromMem(self , xsltStr):
  18.         self.xslt = xsltStr
  19.     # 通过GooSeeker API接口获得xslt
  20.     def setXsltFromAPI(self , APIKey , theme, middle=None, bname=None):
  21.         apiurl = "http://www.gooseeker.com/api/getextractor?key="+ APIKey +"&theme="+quote(theme)
  22.         if (middle):
  23.             apiurl = apiurl + "&middle="+quote(middle)
  24.         if (bname):
  25.             apiurl = apiurl + "&bname="+quote(bname)
  26.         apiconn = request.urlopen(apiurl)
  27.         self.xslt = apiconn.read()
  28.     # 返回当前xslt
  29.     def getXslt(self):
  30.         return self.xslt
  31.     # 提取方法,入参是一个HTML DOM对象,返回是提取结果
  32.     def extract(self , html):
  33.         xslt_root = etree.XML(self.xslt)
  34.         transform = etree.XSLT(xslt_root)
  35.         result_tree = transform(html)
  36.         return result_tree
  37.     # 提取方法,入参是html源码,返回是提取结果
  38.     def extractHTML(self , html):
  39.         doc = etree.HTML(html)
  40.         return self.extract(doc)

  41.   
  42.    
  43. url = 'http://bj.zu.anjuke.com/fangyuan/p1';

  44. rq = request.Request(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'});
  45. conn = request.urlopen(rq);
  46. html = conn.read()

  47. bbsExtra =GsExtractor()
  48. # 设置xslt抓取规则
  49. bbsExtra.setXsltFromAPI("31d24931e043e2d5364d03b8ff9cc77e", "安居客_房源")
  50. # 调用extract方法提取所需内容
  51. result = bbsExtra.extractHTML(html)
  52. print(result)
复制代码


GTBD)W`7B5LE{I)}X7_IHP8.png (162.31 KB, 下载次数: 387)

GTBD)W`7B5LE{I)}X7_IHP8.png
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

精彩推荐

  • Gephi社会网络分析-马蜂窝游记文本分词并同
  • Gephi社会网络分析-基于马蜂窝游记文本以词
  • 知乎话题文本根据词语间距筛选后生成共词矩
  • 马蜂窝游记文本分词后以词语间距为筛选条件
  • 学习使用apriori算法挖掘关联关系

热门用户

GMT+8, 2024-4-26 05:56