1. 程式人生 > >python beautifulsoup 抓取網頁正文內容

python beautifulsoup 抓取網頁正文內容

最近要跟著同學做一個小專案,需要自己找語料庫,於是我用python 的 beautifulsoup 和urllib 來抓取一些網頁內容來做訓練語料。現在寫下來備忘,雖然還有些不足。

這裡,我抓取的是鳳凰軍事的滾動新聞,點開後可以發現是一系列的新聞連結,所以接下來就分兩個方面的工作,第一個是將這些新聞連結全部提取出來,儲存文字。第二個是根據這些連結訪問網頁,抓取正文內容,再儲存文字。

提取新聞連結

通過分析滾動新聞的網頁原始碼,發現這些超連結都是在<div class = "main"> </div>標籤之間(不同網站有不同的格式),用beautifulsoup來提取比較好,若用urllib容提取到其他url,不易區分。

我們在滾動新聞下方會發現有“下一頁”和“前一天”的標籤,於是我們的思路是:本頁的url提取完,如果有“下一頁”標籤,就將其url拿出來訪問,在提取url,若沒有“下一頁”標籤,則取出“前一天”標籤的url來訪問,就這樣迴圈往下提取url,直到你認為夠用了為止。(我做了100次的迴圈,大約爬了3800個url)

程式碼如下:

#encoding=utf-8
#coding=utf-8
import urllib,urllib2  
from bs4 import BeautifulSoup
import re
import os
import string


#得到url的list
def get_url_list(purl):
    #連線
    req = urllib2.Request(purl,headers={'User-Agent':"Magic Browser"})
    page = urllib2.urlopen(req)  
    soup = BeautifulSoup(page.read())
    #讀取標籤
    a_div = soup.find('div',{'class':'main'})
    b_div = a_div.find('div',{'class':'left'})
    c_div = b_div.find('div',{'class':'newsList'})
    
    links4 = []
    #得到url的list
    for link_aa in c_div:
        for link_bb in link_aa:
            links4.append(link_bb.find('a'))
            
    links4 = list(set(links4))
    links4.remove(-1)
    links4.remove(None)

    return links4

#從list中找到想要的新聞連結
#找到要訪問的下一個頁面的url
def get_url(links):

    url = []
    url2 = ''
    url3 = ''
    url4 = ''
    
    i = 0

    for link in links:
        

        if link.contents == [u'後一天']:
            continue
        
        #上一頁  和  下一頁 的標籤情況比較複雜
        #取出“上一頁”標籤的url(貌似不管用)
        if str(link.contents).find(u'/> ') != -1:
            continue

        #取出“下一頁”標籤的url
        if str(link.contents).find(u' <img') != -1:
            url2 = link.get("href")
            i = 1
            continue
        
        if link.contents == [u'前一天']:
            url3 = link.get("href")
            continue
    
        url.append(link.get("href"))

    if(i == 1):
        url4 = url2
    else:
        url4 = url3

    return url , url4

def main():

    link_url = []
    link_url_all = []
    link_url_all_temp = []
    
    next_url = ''

    #開始的url
    purl = 'http://news.ifeng.com/listpage/4550/20140903/1/rtlist.shtml'
    link_url = get_url_list(purl)
    link_url_all , next_url = get_url(link_url)

    #做了100次迴圈
    for i in range(100):
        link_url = get_url_list(next_url)
        link_url_all_temp , next_url = get_url(link_url)
        
        link_url_all = link_url_all + link_url_all_temp

    #將全部url存檔
    path = 'd:\\url.txt'
    fp = open(path,'w')
    for link in link_url_all:
        fp.write(str(link)+'\n')
    fp.close()
    
if __name__ == '__main__':
    main()


    

不過得到的url檔案有少量不相符的(不知為何),可以再寫一個檔案將他們去掉。新聞連結的url長度都是一致的,不相符的url或長或短。

在查詢“上一頁”和“下一頁”標籤時遇到了編碼問題,還好解決了,如程式所示。

提取網頁內容正文

有了上面的一系列的url,就可以提取內容了。

和上面一樣,先看一下網頁原始碼,確定正文內容都在哪些標籤內。我們發現,正文內容都在<div id = "artical_real"  class = "js_img_share_area">  </div>中間,然後用beautifulsoup來提取。(有些新聞是圖片或視訊,格式與文字不一樣,我們去掉不管)

不過這裡有兩個trick,一是正文內容都在<p>  </p>標籤內,怎麼把它取出來,二是有一些網頁的<p> </p>還有其他標籤,怎麼去掉,下面的程式碼裡有

程式碼如下:

#encoding=utf-8
#coding=utf-8

import urllib,urllib2  
from bs4 import BeautifulSoup
import re
import os
import string



links = []

path = 'd:\\url3.txt'
file = open(path,'r')

#得到url
for line in file:
    links = links + [line]

file.close()

print len(links)

i = 1
for link in links:
    print link
    req = urllib2.Request(link,headers={'User-Agent':"Magic Browser"})
    page = urllib2.urlopen(req)
    soup = BeautifulSoup(page.read())
    
    a_div = soup.find('div',{'id':'artical_real'},{'class':'js_img_share_area'})

    if a_div == None:
        continue
    b_div = a_div.find('div',{'id':'main_content'},{'class':'js_selection_area'})

    if b_div == None:
        continue

    kk = b_div.findAll('p')

    if kk == []:
        continue
    
    ss = str(kk)
    ss = ''.join(ss)

    my_cn = re.sub('<span(.*?)</span>','',ss)
    my_cn = ''.join(my_cn)
    my_cn = re.sub('<a(.*?)</a>','',my_cn)
    my_cn = ''.join(my_cn)
    my_cn = re.sub('<strong>(.*?)</strong>','',my_cn)
    my_cn = ''.join(my_cn)
    my_cn = re.findall('<p>(.*?)</p>',my_cn)
    my_cn = ''.join(my_cn)

    pth = 'd:\\webcontext\\'+str(i)+'.txt'
    fp = open(pth,'w')
    
    fp.writelines(my_cn)
    fp.close()

    i = i + 1

    page.close()
    


總結

在執行時,程式常有卡住或是報錯的情況,分析後發現或是網路不好,或是伺服器不好,這時將程式重新執行一下就好了。當然,在url的檔案裡把那些已訪問過的刪掉,從最近一個未訪問的url開始,還要在上面的程式碼中將i從最新的下標開始,以免覆蓋原檔案。

相關推薦

python beautifulsoup 網頁正文內容

最近要跟著同學做一個小專案,需要自己找語料庫,於是我用python 的 beautifulsoup 和urllib 來抓取一些網頁內容來做訓練語料。現在寫下來備忘,雖然還有些不足。 這裡,我抓取的是鳳凰軍事的滾動新聞,點開後可以發現是一系列的新聞連結,所以接下來就分兩個方面

Python爬蟲 BeautifulSoup網頁資料 並儲存到資料庫MySQL

最近剛學習Python,做了個簡單的爬蟲,作為一個簡單的demo希望幫助和我一樣的初學者 程式碼使用python2.7做的爬蟲  抓取51job上面的職位名,公司名,薪資,釋出時間等等 直接上程式碼,程式碼中註釋還算比較清楚 ,沒有安裝mysql需要遮蔽掉相關程式碼:#!/u

python爬蟲-- 網頁、圖片、文章

零基礎入門Python,給自己找了一個任務,做網站文章的爬蟲小專案,因為實戰是學程式碼的最快方式。所以從今天起開始寫Python實戰入門系列教程,也建議大家學Python時一定要多寫多練。 目標 1,學習Python爬蟲 2,爬取新聞網站新聞列表 3,爬取圖片 4,把爬取到的資料存在本地

Python selenium微博內容

(一)程式設計環境 作業系統:Win 10 程式語言:Python 3.6 (二)安裝selenium 這裡使用selenium實現。 如果沒有安裝過python的selenium庫,則安裝命令如下 pip install selenium

python 爬蟲 如何用selenium網頁內容

使用selenium爬取動態網頁資訊 Python selenium自動控制瀏覽器對網頁的資料進行抓取,其中包含按鈕點選、跳轉頁面、搜尋框的輸入、頁面的價值資料儲存、mongodb自動id標識等等等。 首先介紹一下 Python selenium —自動化測試工

[Python]網路爬蟲(二):利用urllib2通過指定的URL網頁內容

版本號:Python2.7.5,Python3改動較大,各位另尋教程。 所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,儲存到本地。  類似於使用程式模擬IE瀏覽器的功能,把URL作為HTTP請求的內容傳送到伺服器端, 然後讀取伺服器端的響應資源。 在

python爬蟲爬非同步載入網頁資訊(python網頁中無法通過網頁標籤屬性內容

1.問題描述 最近由於學習內容的要求,需要從網頁上抓取一些資料來做分析報告,在看了python爬蟲的一些基礎知識之後就直接上手去網站上爬資料了。作為新手踩坑是無法避免,最近就遇到了一個比較難的問題: 一般情況下,要抓去網頁上某個標籤上的內容,在通過urllib下

python多執行緒網頁內容並寫入MYSQL

自己的第一個多執行緒練習,中間踩了不少坑,程式寫的很渣,但是勉強能實現功能需求了 ,實際上抓取網頁是多執行緒在MYSQL寫入的時候是加了執行緒鎖的 ,實際上感覺就不是在多執行緒寫入了,不過作為第一個練習程式就這樣吧 ,後續部落格還會繼續更新優化版本。## htm

pythonBeautifulSoup實現網頁資料

1環境:pycharm,python3.4 2.原始碼解析 import requests import re from bs4 import BeautifulSoup #通過requests.get獲取整個網頁的資料 def getHtmlText(url):    

[Python]網路爬蟲(二):利用urllib通過指定的URL網頁內容

1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=F

Python網頁&批量下載檔案方法初探(正則表示式+BeautifulSoup

最近兩週都在學習Python抓取網頁方法,任務是批量下載網站上的檔案。對於一個剛剛入門python的人來說,在很多細節上都有需要注意的地方,以下就分享一下我在初學python過程中遇到的問題及解決方法。 一、用Python抓取網頁 基本方法: import urllib

python+BeautifulSoup不老歌的網頁正文

不老歌上有很多小說,想把他們都集中為一個txt放在手機裡看。下面程式碼針對以年份歸檔好的文章。 from bs4 import BeautifulSoup import requests import time import re def getContent(url)

curl網頁內容php

dem windows grep 網頁資源 網頁爬蟲 url 工具 () 動態獲取 1.cURL curl是客戶端向服務器請求資源的工具 2.cURL使用場景 網頁資源:網頁爬蟲 webservice數據接口資源:動態獲取接口數據 天氣 號碼歸屬地 ftp資源:下載ftp

JAVA使用Gecco爬蟲 網頁內容

log pro 指定 get www. error 一個 log4j java類 JAVA 爬蟲工具有挺多的,但是Gecco是一個挺輕量方便的工具。 先上項目結構圖。 這是一個 JAVASE的 MAVEN 項目,要添加包依賴,其他就四個文件。log4j.propertie

python 自學第二課: 使用BeautifulSoup鏈接 正則表達式

find sof stdout mpi new page 正則 ges 效果 python 自學第二課: 使用BeautifulSoup抓取鏈接 正則表達式 具體的查看BeautifulSoup文檔(根據自己的安裝的版本查看對應文檔) 文檔鏈接https://www.cr

Python 網頁gb2312亂碼問題

發現 file read earch () spa .com pycharm close python 爬取學校所有人四六級成績時發現爬出網頁中文亂碼 遂google 得到一解決方案 # -*- coding:utf8 -*- import urllib2

記錄一次python網頁下載視訊

最近看了電影狂暴巨獸,連結是那種不固定的http連結,有可能隨時就打不開了,然後想下載下來留著,但是網頁不提供下載,所以就自己抓取了相關視訊,然後下載。廢話不多說,直接上乾貨。 用fiddle抓取主要的視訊。下圖就是抓取時候產生的相關資訊。 逐條進行分析,然後找到電影的包的地址。 http

php網頁內容,獲取網頁資料

php通過simple_html_dom實現抓取網頁內容,獲取核心網頁資料,將網頁資料寫入本地 xxx.json 檔案 其程式碼實現邏輯: 1. 引入simple_html_dom.php檔案       require_once 'simple_ht

python網頁資料處理後視覺化

抓取文章的連結,訪問量儲存到本地 1 #coding=utf-8 2 import requests as req 3 import re 4 import urllib 5 from bs4 import BeautifulSoup 6 import sys 7 import code

利用BeautifulSoup網頁內容

利用BeautifulSoup可以很簡單的爬取網頁上的內容。這個套件可以把一個網頁變成DOM Tree 要使用BeautifulSoup需要使用命令列進行安裝,不過也可以直接用python的ide。 基礎操作 : ① 使用之前需要先從bs4中匯入包:from