㈠ python使用beautifulsoup如何爬取小說正文全部內容
單章的部分應該沒問題,去目錄頁爬下章節鏈接存列表裡遍歷爬取就行了吧。
另外通常手機版站點的反爬會弱一些,有沒有考慮爬手機站?
github、csdn、博客園等等站會有相關的博文涉及相關爬蟲和源碼,去參考一下也好。
還解決不了的話先把「全部正文,不知道咋回事目錄都爬不下來」的情況說的更詳細一點。
㈡ python的爬蟲是什麼意思
Python爬蟲即使用Python程序開發的網路爬蟲(網頁蜘蛛,網路機器人),是一種按照一定的規則,自動地抓取萬維網信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。其實通俗的講就是通過程序去獲取 web 頁面上自己想要的數據,也就是自動抓取數據。網路爬蟲(英語:web crawler),也叫網路蜘蛛(spider),是一種用來自動瀏覽萬維網的網路機器人。其目的一般為編纂網路索引。
網路搜索引擎等站點通過爬蟲軟體更新自身的網站內容或其對其他網站的索引。網路爬蟲可以將自己所訪問的頁面保存下來,以便搜索引擎事後生成索引供用戶搜索。
爬蟲訪問網站的過程會消耗目標系統資源。不少網路系統並不默許爬蟲工作。因此在訪問大量頁面時,爬蟲需要考慮到規劃、負載,還需要講「禮貌」。 不願意被爬蟲訪問、被爬蟲主人知曉的公開站點可以使用robots.txt文件之類的方法避免訪問。這個文件可以要求機器人只對網站的一部分進行索引,或完全不作處理。
互聯網上的頁面極多,即使是最大的爬蟲系統也無法做出完整的索引。因此在公元2000年之前的萬維網出現初期,搜索引擎經常找不到多少相關結果。現在的搜索引擎在這方面已經進步很多,能夠即刻給出高質量結果。
爬蟲還可以驗證超鏈接和HTML代碼,用於網路抓取。
Python 爬蟲
Python 爬蟲架構
Python 爬蟲架構主要由五個部分組成,分別是調度器、URL 管理器、網頁下載器、網頁解析器、應用程序(爬取的有價值數據)。
調度器:相當於一台電腦的 CPU,主要負責調度 URL 管理器、下載器、解析器之間的協調工作。
URL 管理器:包括待爬取的 URL 地址和已爬取的 URL 地址,防止重復抓取 URL 和循環抓取 URL,實現 URL 管理器主要用三種方式,通過內存、資料庫、緩存資料庫來實現。
網頁下載器:通過傳入一個 URL 地址來下載網頁,將網頁轉換成一個字元串,網頁下載器有 urlpb2(Python 官方基礎模塊)包括需要登錄、代理、和 cookie,requests(第三方包)
網頁解析器:將一個網頁字元串進行解析,可以按照我們的要求來提取出我們有用的信息,也可以根據 DOM 樹的解析方式來解析。網頁解析器有正則表達式(直觀,將網頁轉成字元串通過模糊匹配的方式來提取有價值的信息,當文檔比較復雜的時候,該方法提取數據的時候就會非常的困難)、html.parser(Python 自帶的)、beautifulsoup(第三方插件,可以使用 Python 自帶的 html.parser 進行解析,也可以使用 lxml 進行解析,相對於其他幾種來說要強大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 樹的方式進行解析的。
應用程序:就是從網頁中提取的有用數據組成的一個應用。
爬蟲可以做什麼?
你可以用爬蟲爬圖片,爬取視頻等等你想要爬取的數據,只要你能通過瀏覽器訪問的數據都可以通過爬蟲獲取。
爬蟲的本質是什麼?
模擬瀏覽器打開網頁,獲取網頁中我們想要的那部分數據
瀏覽器打開網頁的過程:
當你在瀏覽器中輸入地址後,經過 DNS 伺服器找到伺服器主機,向伺服器發送一個請求,伺服器經過解析後發送給用戶瀏覽器結果,包括 html,js,css 等文件內容,瀏覽器解析出來最後呈現給用戶在瀏覽器上看到的結果
所以用戶看到的瀏覽器的結果就是由 HTML 代碼構成的,我們爬蟲就是為了獲取這些內容,通過分析和過濾 html 代碼,從中獲取我們想要資源。
相關推薦:《Python教程》以上就是小編分享的關於python的爬蟲是什麼意思的詳細內容希望對大家有所幫助,更多有關python教程請關注環球青藤其它相關文章!
㈢ 如何用python寫爬蟲來獲取網頁中所有的文章以及關鍵詞
所謂網頁抓取,就是把URL地址中指定的網路資源從網路流中讀取出來,保存到本地。
類似於使用程序模擬IE瀏覽器的功能,把URL作為HTTP請求的內容發送到伺服器端, 然後讀取伺服器端的響應資源。
在Python中,我們使用urllib2這個組件來抓取網頁。
urllib2是Python的一個獲取URLs(Uniform Resource Locators)的組件。
它以urlopen函數的形式提供了一個非常簡單的介面。
最簡單的urllib2的應用代碼只需要四行。
我們新建一個文件urllib2_test01.py來感受一下urllib2的作用:
import urllib2
response = urllib2.urlopen('http://www..com/')
html = response.read()
print html
按下F5可以看到運行的結果:
我們可以打開網路主頁,右擊,選擇查看源代碼(火狐OR谷歌瀏覽器均可),會發現也是完全一樣的內容。
也就是說,上面這四行代碼將我們訪問網路時瀏覽器收到的代碼們全部列印了出來。
這就是一個最簡單的urllib2的例子。
除了"http:",URL同樣可以使用"ftp:","file:"等等來替代。
HTTP是基於請求和應答機制的:
客戶端提出請求,服務端提供應答。
urllib2用一個Request對象來映射你提出的HTTP請求。
在它最簡單的使用形式中你將用你要請求的地址創建一個Request對象,
通過調用urlopen並傳入Request對象,將返回一個相關請求response對象,
這個應答對象如同一個文件對象,所以你可以在Response中調用.read()。
我們新建一個文件urllib2_test02.py來感受一下:
import urllib2
req = urllib2.Request('http://www..com')
response = urllib2.urlopen(req)
the_page = response.read()
print the_page
可以看到輸出的內容和test01是一樣的。
urllib2使用相同的介面處理所有的URL頭。例如你可以像下面那樣創建一個ftp請求。
req = urllib2.Request('ftp://example.com/')
在HTTP請求時,允許你做額外的兩件事。
1.發送data表單數據
這個內容相信做過Web端的都不會陌生,
有時候你希望發送一些數據到URL(通常URL與CGI[通用網關介面]腳本,或其他WEB應用程序掛接)。
在HTTP中,這個經常使用熟知的POST請求發送。
這個通常在你提交一個HTML表單時由你的瀏覽器來做。
並不是所有的POSTs都來源於表單,你能夠使用POST提交任意的數據到你自己的程序。
一般的HTML表單,data需要編碼成標准形式。然後做為data參數傳到Request對象。
編碼工作使用urllib的函數而非urllib2。
我們新建一個文件urllib2_test03.py來感受一下:
import urllib
import urllib2
url = 'http://www.someserver.com/register.cgi'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
data = urllib.urlencode(values) # 編碼工作
req = urllib2.Request(url, data) # 發送請求同時傳data表單
response = urllib2.urlopen(req) #接受反饋的信息
the_page = response.read() #讀取反饋的內容
如果沒有傳送data參數,urllib2使用GET方式的請求。
GET和POST請求的不同之處是POST請求通常有"副作用",
它們會由於某種途徑改變系統狀態(例如提交成堆垃圾到你的門口)。
Data同樣可以通過在Get請求的URL本身上面編碼來傳送。
import urllib2
import urllib
data = {}
data['name'] = 'WHY'
data['location'] = 'SDU'
data['language'] = 'Python'
url_values = urllib.urlencode(data)
print url_values
name=Somebody+Here&language=Python&location=Northampton
url = 'http://www.example.com/example.cgi'
full_url = url + '?' + url_values
data = urllib2.open(full_url)
這樣就實現了Data數據的Get傳送。
2.設置Headers到http請求
有一些站點不喜歡被程序(非人為訪問)訪問,或者發送不同版本的內容到不同的瀏覽器。
默認的urllib2把自己作為「Python-urllib/x.y」(x和y是Python主版本和次版本號,例如Python-urllib/2.7),
這個身份可能會讓站點迷惑,或者乾脆不工作。
瀏覽器確認自己身份是通過User-Agent頭,當你創建了一個請求對象,你可以給他一個包含頭數據的字典。
下面的例子發送跟上面一樣的內容,但把自身模擬成Internet Explorer。
(多謝大家的提醒,現在這個Demo已經不可用了,不過原理還是那樣的)。
import urllib
import urllib2
url = 'http://www.someserver.com/cgi-bin/register.cgi'
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urllib.urlencode(values)
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()
以上就是python利用urllib2通過指定的URL抓取網頁內容的全部內容,非常簡單吧,希望對大家能有所幫助。
㈣ 如何用python寫個爬蟲抓去文章
這要看你想爬的文章是哪個網站的,然後通過分析這個網站的文章存儲方式以及如何獲得所有文章的鏈接,最後才是用python去實現這個爬取的過程
㈤ 如何用python爬取文獻
用爬蟲框架scrapy,三步,第二步為核心
定義item類
開發spider類
開發pipeline
如果你想知道更多關於python學習,你可以看一看 瘋狂python講義 這本書,書中也有上面的內容和更多python信息
㈥ 求python 爬蟲文章
大體的進度如下:
1.增加了Cron: 用來告訴程序每隔30分鍾 讓一個task 醒來, 跑到指定的那幾個博客上去爬取最新的更新
2.用google 的 Datastore 來存貯每次爬蟲爬下來的內容。。只存貯新的內容。。
就像上次說的那樣,這樣以來 性能有了大幅度的提高: 原來的每次請求後, 爬蟲才被喚醒 所以要花大約17秒的時間才能從後台輸出到前台而現在只需要2秒不到
3.對爬蟲進行了優化
1. Cron.yaml 來安排每個程序醒來的時間
經過翻文檔, 問問題終於弄明白google的cron的工作原理--實際上只是google每隔指定的時間虛擬地訪問一個我們自己指定的url…
因此在Django 下, 根本不需要寫一個純的python 程序 一定不要寫:
if __name__=="__main__":
只需要自己配置一個url 放在views.py里:
def updatePostsDB(request): #deleteAll() SiteInfos=[] SiteInfo={} SiteInfo['PostSite']="L2ZStory" SiteInfo['feerl']="feed://l2zstory.wordpress.com/feed/" SiteInfo['blog_type']="wordpress" SiteInfos.append(SiteInfo) SiteInfo={} SiteInfo['PostSite']="YukiLife" SiteInfo['feerl']="feed://blog.sina.com.cn/rss/1583902832.xml" SiteInfo['blog_type']="sina" SiteInfos.append(SiteInfo) SiteInfo={} SiteInfo['PostSite']="ZLife" SiteInfo['feerl']="feed://ireallife.wordpress.com/feed/" SiteInfo['blog_type']="wordpress" SiteInfos.append(SiteInfo) SiteInfo={} SiteInfo['PostSite']="ZLife_Sina" SiteInfo['feerl']="feed://blog.sina.com.cn/rss/1650910587.xml" SiteInfo['blog_type']="sina" SiteInfos.append(SiteInfo) try: for site in SiteInfos: feerl=site['feerl'] blog_type=site['blog_type'] PostSite=site['PostSite'] PostInfos=getPostInfosFromWeb(feerl,blog_type) recordToDB(PostSite,PostInfos) Msg="Cron Job Done..." except Exception,e: Msg=str(e) return HttpResponse(Msg)
cron.yaml 要放在跟app.yaml同一個級別上:
cron:
- description: retrieve newest posts
url: /task_updatePosts/
schele: every 30 minutes
在url.py 里只要指向這個把task_updatePostsDB 指向url就好了
調試這個cron的過程可以用慘烈來形容。。。在stackoverflow上有很多很多人在問為什麼自己的cron不能工作。。。我一開始也是滿頭是汗,找不著頭腦。。。最後僥幸弄好了,大體步驟也是空泛的很。。但是很朴實:
首先,一定要確保自己的程序沒有什麼syntax error….然後可以自己試著手動訪問一下那個url 如果cron 正常的話,這個時候任務應該已經被執行了 最後實在不行的話多看看log…
2. Datastore的配置和利用--Using Datastore with Django
我的需求在這里很簡單--沒有join…所以我就直接用了最簡陋的django-helper..
這個models.py 是個重點:
復制代碼代碼如下:
from appengine_django.models import BaseModel
from google.appengine.ext import db
classPostsDB(BaseModel):
link=db.LinkProperty()
title=db.StringProperty()
author=db.StringProperty()
date=db.DateTimeProperty()
description=db.TextProperty()
postSite=db.StringProperty()
前兩行是重點中的重點。。。。我一開始天真沒寫第二行。。。結果我花了2個多小時都沒明白是怎麼回事。。得不償失。。。
讀寫的時候, 千萬別忘了。。。PostDB.put()
一開始的時候,我為了省事,就直接每次cron被喚醒, 就刪除全部的數據, 然後重新寫入新爬下來的數據。。。
結果。。。一天過後。。。有4萬條讀寫紀錄。。。。而每天免費的只有5萬條。。。。
所以就改為在插入之前先看看有沒有更新, 有的話就寫,沒的話就不寫。。總算把資料庫這部分搞好了。。。
3.爬蟲的改進:
一開始的時候,爬蟲只是去爬feed里給的文章。。這樣一來,如果一個博客有24*30篇文章的話。。。最多隻能拿到10篇。。。。
這次,改進版能爬所有的文章。。我分別拿孤獨川陵, 韓寒, Yuki和Z的博客做的試驗。。成功的很。。。其中孤獨川陵那裡有720+篇文章。。。無遺漏掉的被爬下來了。。
import urllib#from BeautifulSoup import BeautifulSoupfrom pyquery import PyQuery as pqdef getArticleList(url): lstArticles=[] url_prefix=url[:-6] Cnt=1 response=urllib.urlopen(url) html=response.read() d=pq(html) try: pageCnt=d("ul.SG_pages").find('span') pageCnt=int(d(pageCnt).text()[1:-1]) except: pageCnt=1 for i in range(1,pageCnt+1): url=url_prefix+str(i)+".html" #print url response=urllib.urlopen(url) html=response.read() d=pq(html) title_spans=d(".atc_title").find('a') date_spans=d('.atc_tm') for j in range(0,len(title_spans)): titleObj=title_spans[j] dateObj=date_spans[j] article={} article['link']= d(titleObj).attr('href') article['title']= d(titleObj).text() article['date']=d(dateObj).text() article['desc']=getPageContent(article['link']) lstArticles.append(article) return lstArticles def getPageContent(url): #get Page Content response=urllib.urlopen(url) html=response.read() d=pq(html) pageContent=d("div.articalContent").text() #print pageContent return pageContentdef main(): url='http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html'#Han Han url="http://blog.sina.com.cn/s/articlelist_1225833283_0_1.html"#Gu Du Chuan Ling url="http://blog.sina.com.cn/s/articlelist_1650910587_0_1.html"#Feng url="http://blog.sina.com.cn/s/articlelist_1583902832_0_1.html"#Yuki lstArticles=getArticleList(url) for article in lstArticles: f=open("blogs/"+article['date']+"_"+article['title']+".txt",'w') f.write(article['desc'].encode('utf-8')) #特別注意對中文的處理 f.close() #print article['desc'] if __name__=='__main__': main()
對PyQuery的推薦。。
很遺憾的說, BueautifulSoup讓我深深的失望了。。。在我寫上篇文章的時候,當時有個小bug..一直找不到原因。。在我回家後,又搭上了很多時間試圖去弄明白為什麼BueautifulSoup一直不能抓到我想要的內容。。。後來大體看了看它selector部分的源代碼覺得應該是它對於很多還有<script>tag的不規范html頁面的解析不準確。。。
我放棄了這個庫, 又試了lxml..基於xpath 很好用。。但是xpath的東西我老是需要查文檔。。。所以我又找了個庫PyQuery…可以用jQuery選擇器的工具。。。非常非常非常好用。。。。具體的用法就看上面吧。。。這個庫有前途。。。
隱憂
因為pyquery基於lxml…而lxml的底層又是c…所以估計在gae上用不了。。。我這個爬蟲只能現在在我的電腦上爬好東西。。。然後push到server上。。。
㈦ 如何使用python爬取知乎數據並做簡單分析
一、使用的技術棧:
爬蟲:python27 +requests+json+bs4+time
分析工具: ELK套件
開發工具:pycharm
數據成果簡單的可視化分析
1.性別分布
0 綠色代表的是男性 ^ . ^
1 代表的是女性
-1 性別不確定
可見知乎的用戶男性頗多。
二、粉絲最多的top30
粉絲最多的前三十名:依次是張佳瑋、李開復、黃繼新等等,去知乎上查這些人,也差不多這個排名,說明爬取的數據具有一定的說服力。
三、寫文章最多的top30
四、爬蟲架構
爬蟲架構圖如下:
說明:
選擇一個活躍的用戶(比如李開復)的url作為入口url.並將已爬取的url存在set中。
抓取內容,並解析該用戶的關注的用戶的列表url,添加這些url到另一個set中,並用已爬取的url作為過濾。
解析該用戶的個人信息,並存取到本地磁碟。
logstash取實時的獲取本地磁碟的用戶數據,並給elsticsearchkibana和elasticsearch配合,將數據轉換成用戶友好的可視化圖形。
五、編碼
爬取一個url:
解析內容:
存本地文件:
代碼說明:
* 需要修改獲取requests請求頭的authorization。
* 需要修改你的文件存儲路徑。
源碼下載:點擊這里,記得star哦!https : // github . com/forezp/ZhihuSpiderMan六、如何獲取authorization
打開chorme,打開https : // www. hu .com/,
登陸,首頁隨便找個用戶,進入他的個人主頁,F12(或滑鼠右鍵,點檢查)七、可改進的地方
可增加線程池,提高爬蟲效率
存儲url的時候我才用的set(),並且採用緩存策略,最多隻存2000個url,防止內存不夠,其實可以存在redis中。
存儲爬取後的用戶我說採取的是本地文件的方式,更好的方式應該是存在mongodb中。
對爬取的用戶應該有一個信息的過濾,比如用戶的粉絲數需要大與100或者參與話題數大於10等才存儲。防止抓取了過多的僵屍用戶。
八、關於ELK套件
關於elk的套件安裝就不討論了,具體見官網就行了。網站:https : // www . elastic . co/另外logstash的配置文件如下:
從爬取的用戶數據可分析的地方很多,比如地域、學歷、年齡等等,我就不一一列舉了。另外,我覺得爬蟲是一件非常有意思的事情,在這個內容消費升級的年代,如何在廣闊的互聯網的數據海洋中挖掘有價值的數據,是一件值得思考和需不斷踐行的事情。
㈧ PYTHON 爬蟲
for循環的邏輯似乎是從頁面上找到一個列表,然後模擬打開每個鏈接
㈨ 如何用Python爬蟲獲取那些價值博文
過程大體分為以下幾步:
1. 找到爬取的目標網址;
2. 分析網頁,找到自已想要保存的信息,這里我們主要保存是博客的文章內容;
3. 清洗整理爬取下來的信息,保存在本地磁碟。
打開csdn的網頁,作為一個示例,我們隨機打開一個網頁:
http://blog.csdn.net/u013088062/article/list/1。
可以看到,博主對《C++卷積神經網路》和其它有關機計算機方面的文章都寫得不錯。
1#-*-coding:UTF-8-*-
2importre
3importurllib2
4importsys
5#目的:讀取博客文章,記錄標題,用Htnl格式保存存文章內容
6#版本:python2.7.13
7#功能:讀取網頁內容
8classGetHtmlPage():
9#注意大小寫
10def__init__(self,strPage):
11self.strPapge=strPage
12#獲取網頁
13defGetPage(self):
14req=urllib2.Request(self.strPapge)#建立頁面請求
15rep=req.add_header("User-Agent","Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/38.0.2125.122Safari/537.36SE2.XMetaSr1.0")
16try:
17cn=urllib2.urlopen(req)#網頁請求
18page=cn.read()#讀網頁
19uPage=page.decode("utf-8")#網頁編碼
20cn.close()
21returnuPage
22excepturllib2.URLError,e:#捕獲異常
23print'URLError:',e.code
24return
25excepturllib2.HTTPError,e:#捕獲異常
26print'HTTPError:'+e.reason
27return
28returnrePage
29#正則表達式,獲取想要的內容
30classRePage():
31#正則表達式提取內容,返回鏈表
32defGetReText(self,page,recode):
33rePage=re.findall(recode,page,re.S)
34returnrePage
35#保存文本
36classSaveText():
37defSave(self,text,tilte):
38try:
39t="blog\"+tilte+".html"
40f=file(t,"a")
41f.write(text)
42f.close()
43exceptIOError,e:
44printe.message
45if__name__=="__main__":
46s=SaveText()
47#文件編碼
48#字元正確解碼
49reload(sys)
50sys.setdefaultencoding("utf-8")#獲得系統的默認編碼
51#獲取網頁
52page=GetHtmlPage("http://blog.csdn.net/u013088062/article/list/1")
53htmlPage=page.GetPage()
54#提取內容
55reServer=RePage()
56reBlog=reServer.GetReText(htmlPage,r'.*?(s.+?)')#獲取網址鏈接和標題
57#再向下獲取正文
58forrefinreBlog:
59pageHeard="http://blog.csdn.net/"#加鏈接頭
60strPage=pageHeard+ref[0]
61tilte=ref[1].replace('[置頂]',"")#用替換的功能去除雜的英文
62tilte=tilte.replace("
","").lstrip().rstrip()
63#獲取正文
64htmlPage=GetHtmlPage(strPage)
65htmlPageData=htmlPage.GetPage()
66reBlogText=reServer.GetReText(htmlPageData,'(.+?)')
67#保存文件
68fors1inreBlogText:
69s1='
'+s1
70s.Save(s1,tilte)
㈩ 如何用Python爬蟲抓取網頁內容
首先,你要安裝requests和BeautifulSoup4,然後執行如下代碼.
importrequests
frombs4importBeautifulSoup
iurl='http://news.sina.com.cn/c/nd/2017-08-03/doc-ifyitapp0128744.shtml'
res=requests.get(iurl)
res.encoding='utf-8'
#print(len(res.text))
soup=BeautifulSoup(res.text,'html.parser')
#標題
H1=soup.select('#artibodyTitle')[0].text
#來源
time_source=soup.select('.time-source')[0].text
#來源
origin=soup.select('#artibodyp')[0].text.strip()
#原標題
oriTitle=soup.select('#artibodyp')[1].text.strip()
#內容
raw_content=soup.select('#artibodyp')[2:19]
content=[]
forparagraphinraw_content:
content.append(paragraph.text.strip())
'@'.join(content)
#責任編輯
ae=soup.select('.article-editor')[0].text
這樣就可以了