Python 爬蟲(chóng) 正則抽取網(wǎng)頁(yè)數(shù)據(jù)和Scrapy簡(jiǎn)單使用

多圖預(yù)警 希望進(jìn)來(lái)的時(shí)候你是wifi 好像這句話要放在標(biāo)題上哈....

Python新手 前些天看了一些基本語(yǔ)法發(fā)現(xiàn)繼續(xù)看下去效果甚微(枯(ji)燥(mo)了)
知乎上面的大神 都說(shuō)爬蟲(chóng) 那我就從爬蟲(chóng)開(kāi)始實(shí)踐學(xué)習(xí)吧
先從簡(jiǎn)單的靜態(tài)的一個(gè)頁(yè)面開(kāi)始

干什么都得按照套路來(lái) 一哥們經(jīng)常這樣說(shuō) 干啥事都有套路 跟著我左手右手一個(gè)慢動(dòng)作

如果不使用框架Scrapy
我們拿到這個(gè)網(wǎng)頁(yè)的源文件之后
就得自己用正則表達(dá)式來(lái)抽取想要的數(shù)據(jù)

這里拿糗百做實(shí)驗(yàn) 為什么是糗百 因?yàn)槲铱吹馁Y料是糗百(無(wú)辜的糗百,寶寶不哭)

Paste_Image.png
  • 先要分析頁(yè)面 看怎么抽取出來(lái)我們想要的數(shù)據(jù)
Paste_Image.png

發(fā)現(xiàn)段子都在這個(gè)<div class="content">text</div>標(biāo)簽里面
所以代碼這么實(shí)現(xiàn)

 #coding=utf-8
__author__ = 'Daemon'

import urllib2,re,time

class CB_Spider:
    def __init__(self):
        self.page=1
        self.enable=True

#正則獲取段子內(nèi)容
def getPageContent(self):
    myUrl='http://www.qiushibaike.com/hot/page/'+str(self.page)
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
    headers = { 'User-Agent' : user_agent }
    req = urllib2.Request(myUrl, headers = headers)  #模擬瀏覽器
    myResponse=urllib2.urlopen(req)
    myPgae=myResponse.read()
    unicodePage=myPgae.decode('utf-8')
    #根據(jù)正則表達(dá)式拿到所有的內(nèi)容
    myItems=re.findall('<div.*?class="content">(.*?)</div>',unicodePage,re.S)
    items=[]

    print u'第%s頁(yè)數(shù)據(jù)展示 ' %self.page

    for item in myItems:
        content=item.strip()
        #拿到最后的<!--12345678910-->時(shí)間戳
        timeContent=re.findall(r'<!--(.*?)-->',content)
        #去掉時(shí)間戳
        pattern=re.compile(r'<!--(.*?)-->')
        content=re.sub(pattern,'',content)
        if len(timeContent)>0:
            timeContent=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(int(timeContent[0])))
        else:
            timeContent=''
        #每個(gè)段子前加上發(fā)布時(shí)間
        print timeContent +'\n'+content

    self.page+=1;

print u'''

-----------------------------
操作:輸入daemon退出
功能:按下回車(chē)依次瀏覽今日的糗百熱點(diǎn)
-----------------------------

'''

cbSpider=CB_Spider()
while cbSpider.enable:
    myInput=raw_input()
    if 'daemon'==myInput:
        cbSpider.enable=False
    break
    else:
        cbSpider.getPageContent()
xbspider.gif

到這里就是全部的代碼 用正則自己抽取相關(guān)網(wǎng)頁(yè)的內(nèi)容

但是一般人不這么玩 在實(shí)際項(xiàng)目中 還得用框架 我開(kāi)發(fā)Android的 我也不會(huì)啥都自己寫(xiě) 來(lái)看看Scrapy的簡(jiǎn)單使用 怎么獲取和上面一樣的結(jié)果

先要安裝相關(guān)的環(huán)境 我是按照這個(gè)地址給出安裝步驟進(jìn)行 當(dāng)然不會(huì)每個(gè)人都一切順利


QQ圖片20160121143913.gif

遇到問(wèn)題去Google 基本都能解決 這里不是重點(diǎn)
Scrapy安裝

安裝好了之后 第一步

  • 創(chuàng)建一個(gè)scrapy工程 看圖上的CMD 命令行
Paste_Image.png
  • 我這里用的的Pycharm來(lái)打開(kāi)這個(gè)工程 這里只是為了結(jié)構(gòu)看起來(lái)方便和寫(xiě)代碼方便 因?yàn)檫@里最后還是得靠cmd 來(lái)執(zhí)行 還沒(méi)將Pycharm和Scrapy配置起來(lái) 后面學(xué)習(xí)的時(shí)候跟著主流走
    工程結(jié)構(gòu)如下


    Paste_Image.png

這里就是創(chuàng)建工程 現(xiàn)在來(lái)到我們的項(xiàng)目ScrapyDemo1 寫(xiě)好的

Paste_Image.png

看看這幾個(gè)文件能干嘛
items.py 寫(xiě)上自己的爬蟲(chóng)需要的數(shù)據(jù)的類(lèi) 和相關(guān)屬性 相當(dāng)于在解析數(shù)據(jù)時(shí)的接收器

Paste_Image.png

setting.py 看名字就知道是配置文件 樣子長(zhǎng)這樣 這里是默認(rèn)的哈

Paste_Image.png

其余的幾個(gè)暫時(shí)沒(méi)用到 先不說(shuō)

xb_spider.py 就是我們的實(shí)現(xiàn)文件

#coding=utf-8
from scrapy import Spider

from ScrapyDemo1.items import XBItem

from scrapy.selector import Selector
__author__ = 'Daemon'

class XBSpider(Spider):
    name='xb'  #必須
    #allowed_domains = ["qiushibaike.com"]
    #必須
    start_urls=[
        'http://www.qiushibaike.com/8hr/page/1'
    ]

#必須
def parse(self, response):
    sel=Selector(response)
    sites=sel.xpath('//div[@class="content"]')
    #
    # filename = 'xbdata'
    # open(filename, 'w+').write(len(sites))

    items=[]
    for site in sites:
        item=XBItem()
        item['content']=site.xpath('text()').extract()
        print items.append(item)
    return items

用到了Selector Xpath
Selector文檔
Xpath文檔

W3c的截圖

Paste_Image.png

知道這些 基本能見(jiàn)到的實(shí)踐加調(diào)試運(yùn)用了 因?yàn)槲乙彩切率?/p>

Paste_Image.png

在我的代碼中 是這樣 sites=sel.xpath('//div[@class="content"]') 獲取<div class='content'>他

然后他的text()就是內(nèi)容

現(xiàn)在啟動(dòng)程序 獲取數(shù)據(jù)存儲(chǔ)本地

Paste_Image.png

現(xiàn)在生產(chǎn)了json文件 我們打開(kāi)看看


Paste_Image.png

發(fā)現(xiàn)啥都沒(méi)有 當(dāng)時(shí)就懵逼是吧? 是的懵逼了 哈哈哈

Paste_Image.png

那這里我們就看日志唄 找到錯(cuò)誤日志 就好辦了


Paste_Image.png
Paste_Image.png

報(bào)錯(cuò)都給你了 你可以去google搜索 其實(shí)想想都知道 上面正則的時(shí)候我們模擬了瀏覽器 這里我們沒(méi)有
我們進(jìn)去setting.py設(shè)置就行了

Paste_Image.png

再來(lái)重新運(yùn)行一遍 發(fā)現(xiàn)數(shù)據(jù)存在了 而已已經(jīng)用json文本保存

Paste_Image.png

只是一個(gè)靜態(tài)的頁(yè)面的數(shù)據(jù)爬取 當(dāng)然寫(xiě)這邊文章的目的就是為了實(shí)踐這個(gè)Scrapy框架和對(duì)Python的熟悉 增加理解

寫(xiě)這邊文章的時(shí)候 聽(tīng)的是這首歌


Paste_Image.png

愛(ài)要怎么說(shuō)出口

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容