Scrapy框架结合Spynner采集需进行js,ajax动态加载的网页并提取网页信息(以采集微信公众号文章列表为例)

对于网页的采集有这样几种:

1.静态网页

2.动态网页(需进行js,ajax动态加载数据的网页)

3.需进行模拟登录后才能采集的网页

4.加密的网页

 

3,4的解决方案和思路会在后续blog中陈述

现在只针对1,2的解决方案与思路:

一.静态网页

      对于静态网页的采集解析方法很多很多!java,python都提供了很多的工具包或框架,例如java的httpclient,Htmlunit,Jsoup,HtmlParser等,Python的urllib,urllib2,BeautifulSoup,Scrapy等,不详述,网上资料很多的。

 

二.动态网页

      对于采集来说的动态网页是那些需要经过js,ajax动态加载来获取数据的网页,采集数据的方案分为两种: 

      1.通过抓包工具分析js,ajax的请求,模拟该请求获取js加载后的数据。

      2.调用浏览器的内核,获取加载后的网页源码,然后对源码经行解析

      一个研究爬虫的人js是必须要会得东西,网上学习资料很多,不陈述,写该条只为文章的完整性

调用浏览器内核的工具包Java也有几个,但是不是今天所讲的重点,今天的重点是文章的标题Scrapy框架结合Spynner采集需进行js,ajax动态加载的网页并提取网页信息(以采集微信公众号文章列表为例)

 

 

Start......

1.创建个微信公众号文章列表采集项目(以下简称微采集)

命令代码   收藏代码
  1. scrapy startproject weixin  

 

2.在spider目录下创建一个采集spider文件

Python代码   收藏代码
  1. vim weixinlist.py  

    写入如下代码

Python代码   收藏代码
  1. from weixin.items import WeixinItem  
  2. import sys  
  3. sys.path.insert(0,'..')  
  4. import scrapy  
  5. import time  
  6. from scrapy import Spider  
  7.   
  8. class MySpider(Spider):  
  9.         name = 'weixinlist'  
  10.         allowed_domains = []  
  11.         start_urls = [  
  12.                 'http://weixin.sogou.com/gzh?openid=oIWsFt5QBSP8mn4Jx2WSGw_rCNzQ',  
  13.          ]  
  14.         download_delay = 1  
  15.         print('start init....')  
  16.   
  17.         def parse(self, response):  
  18.                 sel=scrapy.Selector(response)  
  19.                 print('hello,world!')  
  20.                 print(response)  
  21.                 print(sel)  
  22.                 list=sel.xpath('//div[@class="txt-box"]/h4')  
  23.                 items=[]  
  24.                 for single in list:  
  25.                         data=WeixinItem()  
  26.                         title=single.xpath('a/text()').extract()  
  27.                         link=single.xpath('a/@href').extract()  
  28.                         data['title']=title  
  29.                         data['link']=link  
  30.                         if len(title)>0:  
  31.                                 print(title[0].encode('utf-8'))  
  32.                                 print(link)  

 

 

3.在items.py中加入WeixinItem类

 

Python代码   收藏代码
  1. import scrapy  
  2.   
  3.   
  4. class WeixinItem(scrapy.Item):  
  5.     # define the fields for your item here like:  
  6.     # name = scrapy.Field()  
  7.         title=scrapy.Field()  
  8.         link=scrapy.Field()  

 

 

4.在items.py的同级目录下创建一个下载中间件downloadwebkit.py,并向其中写入如下代码:

Python代码   收藏代码
  1. import spynner  
  2. import pyquery  
  3. import time  
  4. import BeautifulSoup  
  5. import sys  
  6. from scrapy.http import HtmlResponse  
  7. class WebkitDownloaderTest( object ):  
  8.     def process_request( self, request, spider ):  
  9. #        if spider.name in settings.WEBKIT_DOWNLOADER:  
  10. #            if( type(request) is not FormRequest ):  
  11.                 browser = spynner.Browser()  
  12.                 browser.create_webview()  
  13.                 browser.set_html_parser(pyquery.PyQuery)  
  14.                 browser.load(request.url, 20)  
  15.                 try:  
  16.                         browser.wait_load(10)  
  17.                 except:  
  18.                         pass  
  19.                 string = browser.html  
  20.                 string=string.encode('utf-8')  
  21.                 renderedBody = str(string)  
  22.                 return HtmlResponse( request.url, body=renderedBody )  

 

 

   这段代码就是调用浏览器内核,获取网页加载后的源码

5.在setting.py文件中进行配置,声明下载使用下载中间件

    在底部加上如下代码:

Python代码   收藏代码
  1. #which spider should use WEBKIT  
  2. WEBKIT_DOWNLOADER=['weixinlist']  
  3.   
  4. DOWNLOADER_MIDDLEWARES = {  
  5.     'weixin.downloadwebkit.WebkitDownloaderTest'543,  
  6. }  
  7.   
  8. import os  
  9. os.environ["DISPLAY"] = ":0"  

 

 

 

6.运行程序:

    运行命令:

 

Python代码   收藏代码
  1. scrapy crawl weixinlist  

    运行结果: 

Python代码   收藏代码
  1. kevinflynndeMacBook-Pro:spiders kevinflynn$ scrapy crawl weixinlist  
  2. start init....  
  3. 2015-07-28 21:13:55 [scrapy] INFO: Scrapy 1.0.1 started (bot: weixin)  
  4. 2015-07-28 21:13:55 [scrapy] INFO: Optional features available: ssl, http11  
  5. 2015-07-28 21:13:55 [scrapy] INFO: Overridden settings: {'NEWSPIDER_MODULE''weixin.spiders''SPIDER_MODULES': ['weixin.spiders'], 'BOT_NAME''weixin'}  
  6. 2015-07-28 21:13:55 [py.warnings] WARNING: :0: UserWarning: You do not have a working installation of the service_identity module: 'No module named service_identity'.  Please install it from <https://pypi.python.org/pypi/service_identity> and make sure all of its dependencies are satisfied.  Without the service_identity module and a recent enough pyOpenSSL to support it, Twisted can perform only rudimentary TLS client hostname verification.  Many valid certificate/hostname mappings may be rejected.  
  7.   
  8. 2015-07-28 21:13:55 [scrapy] INFO: Enabled extensions: CloseSpider, TelnetConsole, LogStats, CoreStats, SpiderState  
  9. 2015-07-28 21:13:55 [scrapy] INFO: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, WebkitDownloaderTest, DefaultHeadersMiddleware, MetaRefreshMiddleware, HttpCompressionMiddleware, RedirectMiddleware, CookiesMiddleware, ChunkedTransferMiddleware, DownloaderStats  
  10. 2015-07-28 21:13:55 [scrapy] INFO: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware  
  11. 2015-07-28 21:13:55 [scrapy] INFO: Enabled item pipelines:   
  12. 2015-07-28 21:13:55 [scrapy] INFO: Spider opened  
  13. 2015-07-28 21:13:55 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)  
  14. 2015-07-28 21:13:55 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023  
  15. QFont::setPixelSize: Pixel size <= 0 (0)  
  16. 2015-07-28 21:14:08 [scrapy] DEBUG: Crawled (200) <GET http://weixin.sogou.com/gzh?openid=oIWsFt5QBSP8mn4Jx2WSGw_rCNzQ> (referer: None)  
  17. hello,world!  
  18. <200 http://weixin.sogou.com/gzh?openid=oIWsFt5QBSP8mn4Jx2WSGw_rCNzQ>  
  19. <Selector xpath=None data=u'<html><head><meta http-equiv="X-UA-Compa'>  
  20. 互联网协议入门  
  21. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=210032701&idx=1&sn=6b1fc2bc5d4eb0f87513751e4ccf610c&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  22. 自己动手写贝叶斯分类器给图书分类  
  23. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=210013947&idx=1&sn=1f36ba5794e22d0fb94a9900230e74ca&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  24. 不当免费技术支持的10种方法  
  25. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209998175&idx=1&sn=216106034a3b4afea6e67f813ce1971f&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  26. 以 Python 为实例,介绍贝叶斯理论  
  27. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209998175&idx=2&sn=2f3dee873d7350dfe9546ab4a9323c05&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  28. 我从腾讯那“偷了”3000万QQ用户数据,出了份很有趣的...  
  29. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209980651&idx=1&sn=11fd40a2dee5132b0de8d4c79a97dac2&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  30. 如何用 Spark 快速开发应用?  
  31. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209820653&idx=2&sn=23712b78d82fb412e960c6aa1e361dd3&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  32. 一起来写个简单的解释器(1)  
  33. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209797651&idx=1&sn=15073e27080e6b637c8d24b6bb815417&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  34. 那个直接在机器码中改 Bug 的家伙  
  35. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209762756&idx=1&sn=04ae1bc3a366d358f474ac3e9a85fb60&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  36. 把一个库开源,你该做些什么  
  37. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209762756&idx=2&sn=0ac961ffd82ead6078a60f25fed3c2c4&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  38. 程序员的困境  
  39. [u'http://mp.weixin.qq.com/s?__biz=MzA4MjEyNTA5Mw==&mid=209696436&idx=1&sn=8cb55b03c8b95586ba4498c64fa54513&3rd=MzA3MDU4NTYzMw==&scene=6#rd']  
  40. 2015-07-28 21:14:08 [scrapy] INFO: Closing spider (finished)  
  41. 2015-07-28 21:14:08 [scrapy] INFO: Dumping Scrapy stats:  
  42. {'downloader/response_bytes'131181,  
  43.  'downloader/response_count'1,  
  44.  'downloader/response_status_count/200'1,  
  45.  'finish_reason''finished',  
  46.  'finish_time': datetime.datetime(201572813148958071),  
  47.  'log_count/DEBUG'2,  
  48.  'log_count/INFO'7,  
  49.  'log_count/WARNING'1,  
  50.  'response_received_count'1,  
  51.  'scheduler/dequeued'1,  
  52.  'scheduler/dequeued/memory'1,  
  53.  'scheduler/enqueued'1,  
  54.  'scheduler/enqueued/memory'1,  
  55.  'start_time': datetime.datetime(2015728131355688111)}  
  56. 2015-07-28 21:14:08 [scrapy] INFO: Spider closed (finished)  
  57. QThread: Destroyed while thread is still running  
  58. kevinflynndeMacBook-Pro:spiders kevinflynn$   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值