scrapy爬虫: https:www.scrapy.org

本篇博客依托的项目: https://github.com/viciousstar/BitcointalkSpider/

一. Scrapy

  • 各种依赖库的安装请提前参考官方文档 http://doc.scrapy.org/en/0.24/intro/install.html, 另外python-dev完整的开发库最好安装, 可以避免很多不知所以然的问题.
  • 如果看英文文档有困难, 可以先参看一下scrapy中文翻译项目 http://scrapy-chs.readthedocs.org/zh_CN/latest/
  • scrapy.contrib.spiders.Rule中的一些提取规则是以正则表达式形式写出, 注意网站中的". ?"等符号要进行转义. eg.
  •      Rule(LinkExtractor(allow = ("https://bitcointalk\.org/index\.php\?board=\d+\.\d+", ) ) )
         

二. scrapy 调试

scrapy本身提供了很好用的交互式调试命令,可以方便调试爬虫的各种功能。

  • 命令格式:scrapy shell url
  • 注意事项:
    • shell 命令可以需要project,也可以不需要project,当然我们调试的时候如果不是刚刚使用scrapy,肯定是为了调试自己project中的某个功能,这是就需要你在你的project目录下使用此命令,如果你的url符合当前project的domin,scrapy会自动调用你的spider,此时的交互式python命令行下的全局变量spider就是你自己编写的spider。
    • 因为scrapy shell 命令是在iinux下的命令,如果网址中包括比较特殊的符号,记得进行转义,比如 “&” 符号。
    • 进入python交互命令中,可以用dir(spider),查看spider中的各种属性,这其中就包括了你自己定义的提取函数,规则等等。
    • 注意利用view(response)在浏览器中观察爬虫看到的网页是否和我们看到的网页一样,其实大部分都是不相同的。
    • 未完待续。。。 (有时间会写一篇详细的图文调试过程)

三. 动态网页爬取的一点,动态url的处理

在爬取 https://bitsharestalk.org 的时候,发现网站会为每一个url增加一个sessionid属性,可能是为了标记用户访问历史,而且这个seesionid随着每次访问都会动态变化,这就为爬虫的去重处理(即标记已经爬取过的网站)和提取规则增加了难度。

比如https://bitsharestalk.org/index.php?board=5.0 会变成 https://bitsharestalk.org/index.phpPHPSESSID=9771d42640ab3c89eb77e8bd9e220b53&board=5.0,下面介绍集中处理方法

    1. 仅适用你的爬虫使用的是scrapy.contrib.spiders.CrawlSpider, 在这个内置爬虫中,你提取url要通过Rule类来进行提取,其自带了对提取后的url进行加工的函数。
             rules =  (
    
                 Rule(LinkExtractor(allow = ("https://bitsharestalk\.org/index\.php\?PHPSESSID\S*board=\d+\.\d+$", "https://bitsharestalk\.org/index\.php\?board=\d+\.\d+$")), process_links = 'link_filtering'),   #默认函数process_links
    
                 Rule(LinkExtractor(allow = ("https://bitsharestalk\.org/index\.php\?PHPSESSID\S*topic=\d+\.\d+$", "https://bitsharestalk\.org/index\.php\?topic=\d+\.\d+$", ),),
    
                     callback = "extractPost",
    
                     follow = True, process_links = 'link_filtering'),
    
                 Rule(LinkExtractor(allow = ("https://bitsharestalk\.org/index\.php\?PHPSESSID\S*action=profile;u=\d+$", "https://bitsharestalk\.org/index\.php\?action=profile;u=\d+$", ),),
    
                     callback = "extractUser", process_links = 'link_filtering')
    
                 )
    
             def link_filtering(self, links):
    
                         ret = []
    
                         for link in links:
    
                             url = link.url
    
                             #print "This is the yuanlai ", link.url
    
                             urlfirst, urllast = url.split("?")
    
                             if urllast:
    
                                 link.url = urlfirst + "?" + urllast.split("&", 1)[1]
    
                                 #print link.url
    
                         return links
         

    link_filtering()函数对url进行了处理,过滤掉了sessid,关于Rule类的process_links函数和links类,官方文档中并没有给出介绍,给出一个参考 https://groups.google.com/forum/#!topic/scrapy-users/RHGtm_2GO1M(也许需要梯子,你懂得)

    如果你是自己实现的爬虫,那么url的处理更是可定制的,只需要自己处理一下就可以了。

    2.  通用方法,修改scrapy的去重策略,直接用自己的算法替代内置算法。或者编写自己的scheduler中间件,这一部分笔者没有亲自实现,应该是版本更新,

    scrapy这方面有改动,读者可以自行探索。参考连接: http://blog.pluskid.org/?p=381

四. Xpath--大多是scrapy response 自集成的xpath特性

  • 传送门 http://www.w3.org/TR/xpath20/
  • 在使用chrome等浏览器自带的提取extract xpath路径的时候, 通常现在的浏览器都会对html文本进行一定的规范化, 导致明明在浏览器中提取正确, 却在程序中返回错误的结果,比如
  •      <table cellpadding="0" cellspacing="0" border="0" style="margin-left: 10px;">
    
         <tbody>
    
         some others
    
         </tbody>
    
         </table>
    浏览器会在table标签下添加tbody

  • 目前本人还没有什么好的解决方法, 暂时的解决方案是, 多用相对路径或者是属性标签等定位而不依赖于绝对路径, 如果非要使用绝对路径的方法:
    • scrapy shell somepage
    • view(response)
    • 然后再开发者工具中看的路径就是原始路径
  • xpath方法extract()返回的都是unicode字符串, 要注意对其进行的操作, 以及适时转化为字符串形式(通常情况下函数会自动帮助你转换, 如果可以转换的话), 尤其是在一起使用正则表达式的时候会产生命名规则正确却匹配不到的情况.
  • 如果在某个xpath对象下继续使用xpath规则提取, 当提取某个对象下的所有某个对象所有tr标签.
  •      html = response.xpath("/html/body")
    
         tr = html.xpath(".//tr") #搜索body下的所有tr必须加上'.', 否则搜索的是整个文档的所有tr
         

五. unicode导入到json文件

使用下载器中间件即可,详情参考代码吧。(有时间详细补充)

ps: 吐槽一下排版,博客排版一直没找到什么好的工具,只能在网页版排了,不知道各位能不能推荐一下 -_-||, 拒绝任何形式的转载。

Scrapy使用以及Xpath的一些坑, 再入剁手的更多相关文章

  1. 浅谈Android Studio3.0更新之路(遇坑必入)

    >可以参考官网设置-> 1 2 >> Fantasy_Lin_网友评论原文地址是:简书24K纯帅豆写的我也更新一下出处[删除]Fa 转自脚本之家 浅谈Android Studi ...

  2. Keil C51 中的函数指针和再入函数

    函数指针是C语言中几个难点之一.由于8051的C编译器的独特要求,函数指针和再入函数有更多的挑战需要克服.主要由于函数变量的传递.典型的(绝大部分8051芯片)函数变量通过堆栈的入栈和出栈命令来传递. ...

  3. 关于在scrapy中使用xpath

    1. 还是以虎嗅为例,他给我返回的是一个json格式的json串 2.那么我需要操作的就是把json串转换成我们的字典格式再进行操作 str=json.loads(response.body)['da ...

  4. scrapy初体验 - 安装遇到的坑及第一个范例

    scrapy,python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.scrapy用途广泛,可以用于数据挖掘.监测和自动化测试.scrapy的安装稍 ...

  5. #0 scrapy爬虫学习中遇到的坑记录

    python 基础学习中对于scrapy的使用遇到了一些问题. 首先进行的是对Amazon.cn的检索结果页进行爬取,很顺利,无碍. 下一个目标是对baidu的搜索结果进行爬取 1,反爬虫 1.1 我 ...

  6. pycharm创建scrapy项目教程及遇到的坑

    最近学习scrapy爬虫框架,在使用pycharm安装scrapy类库及创建scrapy项目时花费了好长的时间,遇到各种坑,根据网上的各种教程,花费了一晚上的时间,终于成功,其中也踩了一些坑,现在整理 ...

  7. scrapy python2升级python3遇到的坑

    换成Python3首先pycharm先执行: 然后看代码自己所需要的第三方库都要重新装 然后执行代码: 遇到这样的错如下: SyntaxError: invalid syntax 先检查print 所 ...

  8. Scrapy解析器xpath

    一.使用xpath 不在scrapy框架中通过response from scrapy.http import HtmlResponse HtmlResponse->TextResponse-& ...

  9. [ 转 ] scrapy 中解决 xpath 中的中文编码问题

    1.问题描述: 实现定位<h2>品牌</h2>节点 brand_tag = sel.xpath("//h2[text()= '品牌']") 报错:Value ...

随机推荐

  1. Fire Net(深搜 和一前不一样的深搜)

    /* http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1162 本题妙处: 用一个数对行取商是 ...

  2. 《A First Course in Probability》-chaper5-连续型随机变量-正态分布

    古典统计学问题一开始起源于赌博,让我们看这样一道有关赌博的问题. Q:A.B两人进行n局赌博,A胜的概率是p,现在设置随机变量X表示A赢的局数,当X>np,A给赌场X-np元,否则B给赌场np- ...

  3. Mac下Intellij IDea发布Web项目详解一

    Mac下Intellij IDea发布Web项目详解一 Mac下Intellij IDea发布Java Web项目(适合第一次配置Tomcat的家伙们)详解二 Mac下Intellij IDea发布J ...

  4. C++的一些内置函数

    C++里面有一些内置函数,实现了一些常用功能.虽然我手写也能写出这些函数,但是在srm或者其他一些需要速度的地方,用内置函数的优势就能体现出来了. 1.__gcd(a, b),返回a,b的最大公约数, ...

  5. hdu 4632区间 dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 用点容斥原理转移状态, dp[i][j]=dp[i+1][j]+dp[i][j-1]-dp[i+ ...

  6. 使用python进行接口测试

    最近在做接口测试,之前公司的方案是使用postman进行接口测试.但是伟大的墙导致我们只能用离线版postman..然后一个很长很长的接口列表,一个接一个的访问.我的天哪..所以萌生了一个想法,使用p ...

  7. android——wifi系统架构

    1. 系统架构 Android WiFi系统引入了wpa_supplicant,它的整个WiFi系统以wpa_supplicant为核心来定义上层用户接口和下层驱动接口.整个WiFi系统架构如下图所示 ...

  8. Textview 文本旋转,倾斜

    有时候Android自带的控件无法满足我们的某些要求,这时就需要我们自定义控件来实现这些功能.比如需要一个TextView里的字倾斜一定的角度,就需要自定义TextView. 代码如下: ? 1 2 ...

  9. Open-source Project官方地址

    非常遗憾因为这篇博文是专门搜集各个开源项目的各种官方连接地址的,所以链接较多,csdn不同意保存. 请点击这里下载. 因为我的积分不多了,所以这个文档须要一个积分..应该不多吧...确实没有积分的童鞋 ...

  10. HeadFirst设计模式笔记:(六)命令模式 —— 封装调用

    1.概念 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 在面向对象的程序 ...