利用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
?
但是有些標題直接的內容還需要處理,比如<<ONE?IS?ALL>>,本來應該解釋為《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编写网络爬虫下载文章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python解析XML文件
- 下一篇: PIL模块与随机生成中文验证码