日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

利用Python编写网络爬虫下载文章

發布時間:2024/4/11 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用Python编写网络爬虫下载文章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天來講如何利用Python爬蟲下載文章,拿韓寒的博客為例來一步一步進行詳細探討。。。

?

韓寒的博客地址是:http://blog.sina.com.cn/s/articlelist_1191258123_0_1.html

?

可以看出左邊是文章列表,而且不止一頁,我們先從最簡單的開始,先對一篇文章進行下載,再研究對一頁所有的文

章進行下載,最后再研究對所有的文章下載。

?

?

第一步:對一篇文章下載

?

????我們打開韓寒的博客,然后查看源碼,可以看出每一篇文章的列表源碼為:

?? ?<span class="atc_title"><a title="東望洋" target="_blank"??

??? href="http://blog.sina.com.cn/s/blog_4701280b0102eck1.html">東望洋</a></span>

?

??? 我們主要是想提取出中間綠色部分的URL,然后找到這篇文章的正文進行分析,然后提取進行下載。首先,假

??? 設已經得到這個字符串,然后研究如何提取這個URL,觀察發現,對于所有的這類字符串,都有一個共同點,那

??? 就是都含有子串'<a title=','href='和'.html',那么我們可以用最笨的方式---查找子串進行定界。

?

??? 在Python中有一個方法叫做find(),是用來查找子串的,返回子串出現的位置,那么,可以用如下代碼來提

??? 取URL,并讀取文件和下載文件。

?

#encoding:utf-8 import urllib2def getURL(str):start = str.find(r'href=')start += 6end = str.find(r'.html')end += 5url = str[start : end]return urldef getContext(url):text =urllib2.urlopen(url).read()return textdef StoreContext(url):content = getContext(url)filename = url[-20:]open(filename, 'w').write(content)if __name__ == '__main__':str = '<span class="atc_title"><a title="東望洋" target="_blank" href="http://blog.sina.com.cn/s/blog_4701280b0102eck1.html">東望洋</a></span>' url = getURL(str)StoreContext(url)


?

?

第二,三步:下載所有的文章

???

??? 在這一步中,我們要提取第一頁所有的文章的URL和標題,不再采用上面第一步的find()函數,畢竟這個函數

??? 缺乏靈活性,那么采用正則表達式最好。

?

??? 首先采集數據,觀察發現,所有文章的URL都符合

?

??? <a title="..." target="_blank" href="http://blog.sina.com.cn....html">

?

??? 這一規則,所以我們可以設置正則表達式

?

??? r'<a title=".+" target="_blank" href="(http://blog.sina\.com\.cn.+\.html)">'

?

????? 這樣就容易了,下面是爬取韓寒所有文章,并在本地保存為.html文件。

?

代碼:

#coding:utf-8 import re import urllib2def getPageURLs(url):text = urllib2.urlopen(url).read()pattern = r'<a title=".+" target="_blank" href="(http://blog.sina\.com\.cn.+\.html)">'regex = re.compile(pattern)urlList = re.findall(regex,text)return urlListdef getStore(cnt,url):text = urllib2.urlopen(url)context = text.read();text.close()filename = 'HanhanArticle/'+str(cnt) + '.html'f = open(filename,'w')f.write(context)f.close()def getAllURLs():urls = []cnt = 0for i in xrange(1,8):urls.append('http://blog.sina.com.cn/s/articlelist_1191258123_0_'+str(i)+'.html')for url in urls:tmp = getPageURLs(url)for i in tmp:cnt += 1getStore(cnt,i)if __name__ == '__main__':getAllURLs()


?

由于我把文章的標題用一個數字來命名,似乎不是很完美,還有兩個問題沒有解決,怎么提取文章的標題?,這是涉

及到中文提取,怎么把文章的內容提取出來保存為txt格式的文件?

?

如果能解決上面的兩個問題,那么才算是真正地用網絡爬蟲技術實現了對韓寒博客的下載。

?

?

(1)提取文章的標題

?

?? 為了方便操作,我們用BeautifulSoup來分析網頁,對html文本我們提取title之間的內容為

?

??? <title>東望洋_韓寒_新浪博客</title>

?

???對這個強制轉化為字符串,然后進行切片操作,大致取string[7 : -28],得到了文章的標題。

from bs4 import BeautifulSoup import refor i in xrange(1,317):filename = 'HanhanArticle/' + str(i) + '.html'html = open(filename,'r')soup = BeautifulSoup(html)html.close()title = soup.find('title')string = str(title)article = string[7 : -28].decode('utf-8')if article[0] != '.':print article


?

但是有些標題直接的內容還需要處理,比如&lt;&lt;ONE?IS?ALL&gt;&gt;,本來應該解釋為《ONE IS ALL》

還有比如中央電視臺很*很**,這里的**在文件中不能作為名稱字符。

#coding:utf-8 import re import urllib2 from bs4 import BeautifulSoupdef getPageURLs(url):text = urllib2.urlopen(url).read()pattern = r'<a title=".+" target="_blank" href="(http://blog.sina\.com\.cn.+\.html)">'regex = re.compile(pattern)urlList = re.findall(regex,text)return urlListdef getStore(title,url):text = urllib2.urlopen(url)context = text.read();text.close()filename = 'HanhanArticle/'+ title + '.html'f = open(filename,'w')f.write(context)f.close()def getTitle(url):html = urllib2.urlopen(url).read()soup = BeautifulSoup(html)title = soup.find('title')string = str(title)return string[7 : -28]def Judge(title):lens = len(title)for i in xrange(0,lens):if title[i] == '*':return Falsereturn Truedef getAllURLs():urls = []for i in xrange(1,8):urls.append('http://blog.sina.com.cn/s/articlelist_1191258123_0_'+str(i)+'.html')for url in urls:tmp = getPageURLs(url)for i in tmp:title = getTitle(i).decode('utf-8')print titleif title[0] != '.' and Judge(title):getStore(title,i)if __name__ == '__main__':getAllURLs()

?

提取正文部分后續再處理。。。

?

總結

以上是生活随笔為你收集整理的利用Python编写网络爬虫下载文章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。