久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Python爬蟲:抓取One網(wǎng)頁(yè)上的每日一話和圖

 妙行蓮花 2016-05-10

來(lái)源:取水-簡(jiǎn)書

鏈接:http://www.jianshu.com/p/c4f35dfe1a1f(點(diǎn)擊尾部閱讀原文前往)

已獲得轉(zhuǎn)載授權(quán)


先說(shuō)下需求:


最近打算搜集點(diǎn)源數(shù)據(jù),,豐富下生活,。嗯,最近看到One這個(gè)APP蠻好的,。每天想你推送一張圖和一段話,。很喜歡,簡(jiǎn)單不復(fù)雜,。而我想要把所有的句子都保存下來(lái),,又不想要每個(gè)頁(yè)面都去手動(dòng)查看。因此,,就有了Python,。之前有點(diǎn)Python基礎(chǔ),不過(guò)沒(méi)有深入?,F(xiàn)在也沒(méi)有深入,,用哪學(xué)哪吧。

網(wǎng)站的內(nèi)容是這樣的,,我想要圖片和這段話:


one

(一)


一臺(tái)MAC電腦


(二)Python環(huán)境搭建(所有命令都是在terminal中輸入的)


  • 安裝homebrew:


/usr/bin/ruby -e '$(curl -fsSL https://raw./Homebrew/install/master/install)'


  • 安裝pip:這里我在terminal中輸入python -v,homebrew會(huì)自動(dòng)幫你升級(jí)Python到2.7.11版本的,。2.7.11版本里自帶了pip工具。

  • 安裝virtualenv:


pip install virtualenv


  • 安裝request和beautifulsoup4:


pip install requests beautifulsoup4


參考這里 (http:///blog/2014/04/24/easy-web-scraping-with-python/)


(三)分析


目的:找出三個(gè)內(nèi)容所在的網(wǎng)頁(yè)標(biāo)簽的位置,,然后將它們提取出來(lái),。


網(wǎng)址:http:///one/1293


谷歌瀏覽器,右鍵->顯示網(wǎng)頁(yè)源代碼,然后就會(huì)彈出一堆HTML的東西了,。這樣的:

網(wǎng)頁(yè)源文件


我想要的內(nèi)容是這段話:“即使熱戀者的情感是錯(cuò)覺(jué),、幻象或自戀行為,那又何妨,,所謂人生就是一段不斷追求情愛(ài)的路程,。 by 森山大道”。它在圖中畫紅線的地方,。在標(biāo)簽里的中,,之后會(huì)用到,先往下看,。


圖片的鏈接在哪里,?顯然不在中,往下找,,然后就在中,,發(fā)現(xiàn)2處和圖片類似的鏈接??磮D


圖片鏈接地址


哪個(gè)鏈接是呢,,點(diǎn)擊去,發(fā)現(xiàn)后一個(gè)鏈接,,也就是67行這個(gè)img標(biāo)簽的鏈接是,。

然后,我還想知道哪一天的圖和文字,。嗯,,在回到標(biāo)簽里,,很明顯有個(gè)title,

里面的東西就是我們要的。這樣:


VOL.1271 - 「ONE · 一個(gè)」


(四)python編碼


想要抓取網(wǎng)頁(yè)上的內(nèi)容,,又不想自己去解析HTML,,只好求助萬(wàn)能的Google了,。然后就找到了上面的鏈接,。主要有兩個(gè)工具:request加載網(wǎng)頁(yè),,BeautifulSoup4解析HTML。


首先,,抓取我們需要的哪三個(gè)內(nèi)容:

進(jìn)入python環(huán)境,,然后敲入下面的代碼:


import requests

import bs4

response = requests.get('http:///one/1295')

soup = bs4.BeautifulSoup(response.text,'html.parser')


這樣,,就可以將網(wǎng)頁(yè)信息存儲(chǔ)到soup中了,。你可以敲入print soup試試。


接下來(lái),,我們獲得中的數(shù)字1271,。怎么獲得呢,beautifulsoup4教程,提供了很好的方法,,可以通過(guò)tag查找得到title的內(nèi)容,,然后截取字符串。termianl中輸入:


soup.title.string[3:7]


title是tag值,,string是tag=title的字符串的值,,也就是tag,所以不用做判斷,,直接獲取即可,。


接下來(lái),獲取一段話,。



要截取的內(nèi)容


這段話在中,,而這里又有太多的了,怎么辦,。這里要用到select方法了,,它可以查找所有的,并返回一個(gè)列表,。還要用到get方法,,get可以獲得tag的屬性,如tag: tag.get(‘a(chǎn)ttr’)值等于abc,。這里我們要獲取的屬性是name,,通過(guò)name=’description’來(lái)區(qū)分。


for meta in soup.select('meta'):

    if meta.get('name') == 'description':

        print meta.get('content')


接下來(lái),,在兩個(gè)img標(biāo)簽中,,查找第2個(gè)img標(biāo)簽標(biāo)定的鏈接。這里通過(guò)find_all方法,,它可以查找所有的符合要求的標(biāo)簽,。


soup.find_all('img')[1]['src']


這樣,我們就把所需要的信息找出來(lái)了,。


終端示例


等等,,之后我們還需要并發(fā)和保存文件。在此之前,,先來(lái)看點(diǎn)別的,。map函數(shù)有兩個(gè)參數(shù),一個(gè)是函數(shù),,一個(gè)是序列,。將序列的每個(gè)值,作為參數(shù)傳遞給函數(shù),,返回一個(gè)列表,。參考這里

示例:

def echoInfo(num):

    return num

 

data = map(echoInfo, range(0,10))

print data


結(jié)果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


然后并發(fā), python可以跨平臺(tái)使用,,自身提供了多進(jìn)程支持模塊:multiprocessing。而pool可以用來(lái)創(chuàng)建大量的子進(jìn)程,。


保存數(shù)據(jù)到文件,。這里我們是吧數(shù)據(jù)解析后存儲(chǔ)到字典中,然后序列化為JSON模型,,最后保存到文件的,。


即:字典->JSON模型->存儲(chǔ)到文件。

字典->JSON模型,,使用的是JSON模塊的json.dumps方法,,該方法有一個(gè)參數(shù),參數(shù)為字典,,返回值是JSON字符串,。


JSON模型->文件,使用的是json.load方法,,可以將JSON存儲(chǔ)到文件中,。


全部的代碼示例如下:

import argparse

import re

from multiprocessing import Pool

import requests

import bs4

import time

import json

import io

 

root_url = 'http://'

 

def get_url(num):

    return root_url + '/one/' + str(num)

 

def get_urls(num):

    urls = map(get_url, range(100,100+num))

    return urls

 

def get_data(url):

  dataList = {}

  response = requests.get(url)

  if response.status_code != 200:

      return {'noValue': 'noValue'}

  soup = bs4.BeautifulSoup(response.text,'html.parser')

  dataList['index'] = soup.title.string[4:7]

  for meta in soup.select('meta'):

    if meta.get('name') == 'description':

      dataList['content'] = meta.get('content')

  dataList['imgUrl'] = soup.find_all('img')[1]['src']

  return dataList

 

if __name__=='__main__':

  pool = Pool(4)

  dataList = []

  urls = get_urls(10)

  start = time.time()

  dataList = pool.map(get_data, urls)

  end = time.time()

  print 'use: %.2f s' % (end - start)

  jsonData = json.dumps({'data':dataList})

  with open('data.txt', 'w') as outfile:

    json.dump(jsonData, outfile)



●本文編號(hào)56,以后想閱讀這篇文章直接輸入56即可,。

●輸入m可以獲取到文章目錄


推薦15個(gè)技術(shù)類公眾微信

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多