Python爬蟲: 抓取One網頁上的每日一話和圖

先說下需求:

最近打算搜集點源數據,豐富下生活。嗯,最近看到One這個APP蠻好的。每天想你推送一張圖和一段話。很喜歡,簡單不復雜。而我想要把所有的句子都保存下來,又不想要每個頁面都去手動查看。因此,就有了Python。之前有點Python基礎,不過沒有深入。現在也沒有深入,用哪學哪吧。
網站的內容是這樣的,我想要圖片和這段話:

one

(一)
一臺MAC電腦

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

  • 安裝homebrew
    /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  • 安裝pip:這里我在terminal中輸入python -v,homebrew會自動幫你升級Python到2.7.11版本的。2.7.11版本里自帶了pip工具。
  • 安裝virtualenv:
    pip install virtualenv
  • 安裝request和beautifulsoup4:
    pip install requests beautifulsoup4
    參考這里

(三)分析
目的:找出三個內容所在的網頁標簽的位置,然后將它們提取出來。
網址:http://wufazhuce.com/one/1293
谷歌瀏覽器,右鍵->顯示網頁源代碼,然后就會彈出一堆HTML的東西了。這樣的:

網頁源文件

我想要的內容是這段話:“即使熱戀者的情感是錯覺、幻象或自戀行為,那又何妨,所謂人生就是一段不斷追求情愛的路程。 by 森山大道”。它在圖中畫紅線的地方。在<heda>標簽里的<meta>中,之后會用到,先往下看。
圖片的鏈接在哪里?顯然不在<head>中,往下找,然后就在<body>中,發現2處和圖片類似的鏈接。看圖

圖片鏈接地址

哪個鏈接是呢,點擊去,發現后一個鏈接,也就是67行這個img標簽的鏈接是。
然后,我還想知道哪一天的圖和文字。嗯,在回到<head>標簽里,很明顯有個<title>,里面的東西就是我們要的。這樣:
<title>VOL.1271 - 「ONE · 一個」</title>
(四)python編碼
想要抓取網頁上的內容,又不想自己去解析HTML,只好求助萬能的Google了。然后就找到了上面的鏈接。主要有兩個工具:request加載網頁,BeautifulSoup4解析HTML。

首先,抓取我們需要的哪三個內容:
進入python環境,然后敲入下面的代碼:

import requests
import bs4
response = requests.get('http://wufazhuce.com/one/1295')
soup = bs4.BeautifulSoup(response.text,"html.parser")

這樣,就可以將網頁信息存儲到soup中了。你可以敲入print soup試試。

接下來,我們獲得<title>VOL.1271 - 「ONE · 一個」</title>中的數字1271。怎么獲得呢,beautifulsoup4教程,提供了很好的方法,可以通過tag查找得到title的內容,然后截取字符串。termianl中輸入:

soup.title.string[3:7]

title是tag值,string是tag=title的字符串的值,也就是<title></title>之間的值,因為只有一個<title>tag,所以不用做判斷,直接獲取即可。

接下來,獲取一段話。

要截取的內容

這段話在<meta>中,而這里又有太多的<meta>了,怎么辦。這里要用到select方法了,它可以查找所有的<meta>,并返回一個列表。還要用到get方法,get可以獲得tag的屬性,如tag: <meta attr='abc'> tag.get('attr')值等于abc。這里我們要獲取的屬性是name,通過name='description'來區分。

for meta in soup.select('meta'):
    if meta.get('name') == 'description':
        print meta.get('content')

接下來,在兩個img標簽中,查找第2個img標簽標定的鏈接。這里通過find_all方法,它可以查找所有的符合要求的標簽。

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

這樣,我們就把所需要的信息找出來了。

終端示例

等等,之后我們還需要并發和保存文件。在此之前,先來看點別的。map函數有兩個參數,一個是函數,一個是序列。將序列的每個值,作為參數傳遞給函數,返回一個列表。參考這里
示例:

def echoInfo(num):
    return num

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

結果: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
然后并發, python可以跨平臺使用,自身提供了多進程支持模塊:multiprocessing。而pool可以用來創建大量的子進程。
保存數據到文件。這里我們是吧數據解析后存儲到字典中,然后序列化為JSON模型,最后保存到文件的。
即:字典->JSON模型->存儲到文件。
字典->JSON模型,使用的是JSON模塊的json.dumps方法,該方法有一個參數,參數為字典,返回值是JSON字符串。
JSON模型->文件,使用的是json.load方法,可以將JSON存儲到文件中。

全部的代碼示例如下:

import argparse
import re
from multiprocessing import Pool
import requests
import bs4
import time
import json
import io

root_url = 'http://wufazhuce.com'

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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容