国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Scrapy使用以及Xpath的一些坑,再入剁手

2019-11-14 17:27:42
字體:
供稿:網(wǎng)友

scrapy爬蟲: https:www.scrapy.org

本篇博客依托的項(xiàng)目: https://github.com/viciousstar/BitcointalkSpider/

一. Scrapy

  • 各種依賴庫的安裝請?zhí)崆皡⒖脊俜轿臋n http://doc.scrapy.org/en/0.24/intro/install.html, 另外python-dev完整的開發(fā)庫最好安裝, 可以避免很多不知所以然的問題.
  • 如果看英文文檔有困難, 可以先參看一下scrapy中文翻譯項(xiàng)目 http://scrapy-chs.readthedocs.org/zh_CN/latest/
  • scrapy.contrib.spiders.Rule中的一些提取規(guī)則是以正則表達(dá)式形式寫出, 注意網(wǎng)站中的". ?"等符號(hào)要進(jìn)行轉(zhuǎn)義. eg.
  • Rule(LinkExtractor(allow = ("https://bitcointalk/.org/index/.php/?board=/d+/./d+", ) ) )

二. scrapy 調(diào)試

scrapy本身提供了很好用的交互式調(diào)試命令,可以方便調(diào)試爬蟲的各種功能。

 

  • 命令格式:scrapy shell url
  • 注意事項(xiàng):
    • shell 命令可以需要PRoject,也可以不需要project,當(dāng)然我們調(diào)試的時(shí)候如果不是剛剛使用scrapy,肯定是為了調(diào)試自己project中的某個(gè)功能,這是就需要你在你的project目錄下使用此命令,如果你的url符合當(dāng)前project的domin,scrapy會(huì)自動(dòng)調(diào)用你的spider,此時(shí)的交互式python命令行下的全局變量spider就是你自己編寫的spider。
    • 因?yàn)閟crapy shell 命令是在iinux下的命令,如果網(wǎng)址中包括比較特殊的符號(hào),記得進(jìn)行轉(zhuǎn)義,比如 “&” 符號(hào)。
    • 進(jìn)入python交互命令中,可以用dir(spider),查看spider中的各種屬性,這其中就包括了你自己定義的提取函數(shù),規(guī)則等等。
    • 注意利用view(response)在瀏覽器中觀察爬蟲看到的網(wǎng)頁是否和我們看到的網(wǎng)頁一樣,其實(shí)大部分都是不相同的。
    • 未完待續(xù)。。。 (有時(shí)間會(huì)寫一篇詳細(xì)的圖文調(diào)試過程)

三. 動(dòng)態(tài)網(wǎng)頁爬取的一點(diǎn),動(dòng)態(tài)url的處理

在爬取 https://bitsharestalk.org 的時(shí)候,發(fā)現(xiàn)網(wǎng)站會(huì)為每一個(gè)url增加一個(gè)sessionid屬性,可能是為了標(biāo)記用戶訪問歷史,而且這個(gè)seesionid隨著每次訪問都會(huì)動(dòng)態(tài)變化,這就為爬蟲的去重處理(即標(biāo)記已經(jīng)爬取過的網(wǎng)站)和提取規(guī)則增加了難度。

比如https://bitsharestalk.org/index.php?board=5.0 會(huì)變成 https://bitsharestalk.org/index.phpPHPSESSID=9771d42640ab3c89eb77e8bd9e220b53&board=5.0,下面介紹集中處理方法

 

    1. 僅適用你的爬蟲使用的是scrapy.contrib.spiders.CrawlSpider, 在這個(gè)內(nèi)置爬蟲中,你提取url要通過Rule類來進(jìn)行提取,其自帶了對提取后的url進(jìn)行加工的函數(shù)。
        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'),   #默認(rèn)函數(shù)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()函數(shù)對url進(jìn)行了處理,過濾掉了sessid,關(guān)于Rule類的process_links函數(shù)和links類,官方文檔中并沒有給出介紹,給出一個(gè)參考 https://groups.google.com/forum/#!topic/scrapy-users/RHGtm_2GO1M(也許需要梯子,你懂得)

    如果你是自己實(shí)現(xiàn)的爬蟲,那么url的處理更是可定制的,只需要自己處理一下就可以了。

    2.  通用方法,修改scrapy的去重策略,直接用自己的算法替代內(nèi)置算法。或者編寫自己的scheduler中間件,這一部分筆者沒有親自實(shí)現(xiàn),應(yīng)該是版本更新,

    scrapy這方面有改動(dòng),讀者可以自行探索。參考連接: http://blog.pluskid.org/?p=381


     

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

  •  傳送門 http://www.w3.org/TR/xpath20/
  • 在使用Chrome等瀏覽器自帶的提取extract xpath路徑的時(shí)候, 通常現(xiàn)在的瀏覽器都會(huì)對html文本進(jìn)行一定的規(guī)范化, 導(dǎo)致明明在瀏覽器中提取正確, 卻在程序中返回錯(cuò)誤的結(jié)果,比如
  • <table cellpadding="0" cellspacing="0" border="0" style="margin-left: 10px;">
    <tbody>
    some others
    </tbody>
    </table>

    瀏覽器會(huì)在table標(biāo)簽下添加tbody

  • 目前本人還沒有什么好的解決方法, 暫時(shí)的解決方案是, 多用相對路徑或者是屬性標(biāo)簽等定位而不依賴于絕對路徑, 如果非要使用絕對路徑的方法:
    • scrapy shell somepage
    • view(response)
    • 然后再開發(fā)者工具中看的路徑就是原始路徑
  • xpath方法extract()返回的都是unicode字符串, 要注意對其進(jìn)行的操作, 以及適時(shí)轉(zhuǎn)化為字符串形式(通常情況下函數(shù)會(huì)自動(dòng)幫助你轉(zhuǎn)換, 如果可以轉(zhuǎn)換的話), 尤其是在一起使用正則表達(dá)式的時(shí)候會(huì)產(chǎn)生命名規(guī)則正確卻匹配不到的情況.
  • 如果在某個(gè)xpath對象下繼續(xù)使用xpath規(guī)則提取, 當(dāng)提取某個(gè)對象下的所有某個(gè)對象所有tr標(biāo)簽.
  • html = response.xpath("/html/body")
    tr = html.xpath(".//tr"#搜索body下的所有tr必須加上'.', 否則搜索的是整個(gè)文檔的所有tr

 五. unicode導(dǎo)入到j(luò)son文件

  使用下載器中間件即可,詳情參考代碼吧。(有時(shí)間詳細(xì)補(bǔ)充)

 ps: 吐槽一下排版,博客排版一直沒找到什么好的工具,只能在網(wǎng)頁版排了,不知道各位能不能推薦一下 -_-||, 拒絕任何形式的轉(zhuǎn)載。 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 延寿县| 舒兰市| 洛浦县| 通化县| 商南县| 泸州市| 五原县| 治县。| 叙永县| 石狮市| 永川市| 辛集市| 集贤县| 葵青区| 清苑县| 伊宁市| 金昌市| 诏安县| 若尔盖县| 广水市| 上高县| 科尔| 兴隆县| 剑河县| 高陵县| 绥芬河市| 康马县| 兰坪| 赤水市| 县级市| 白河县| 云梦县| 清远市| 威海市| 上犹县| 连南| 连南| 阳原县| 武威市| 唐山市| 三原县|