今天小編給大家分享一下Python爬蟲實例分析的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
創(chuàng)新互聯(lián)公司2013年至今,先為富民等服務建站,富民等地企業(yè),進行企業(yè)商務咨詢服務。為富民企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。
既然用python,那么自然少不了語言環(huán)境。于是乎到官網(wǎng)下載了3.5版本的。安裝完之后,隨機選擇了一個編輯器叫PyCharm,話說python編輯器還真挺多的。
當然我不知道python是怎么進行網(wǎng)絡請求的,其中還有什么2.0和3.0的不同,中間曲曲折折了不少,最終還是寫出了最簡單的一段請求代碼。
import urllib.parse import urllib.request
# params CategoryId=808 CategoryType=SiteHome ItemListActionName=PostList PageIndex=3 ParentCategoryId=0 TotalPostCount=4000 def getHtml(url,values): user_agent='Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36' headers = {'User-Agent':user_agent} data = urllib.parse.urlencode(values) response_result = urllib.request.urlopen(url+'?'+data).read() html = response_result.decode('utf-8') return html
#獲取數(shù)據(jù) def requestCnblogs(index): print('請求數(shù)據(jù)') url = 'http://www.cnblogs.com/mvc/AggSite/PostList.aspx' value= { 'CategoryId':808, 'CategoryType' : 'SiteHome', 'ItemListActionName' :'PostList', 'PageIndex' : index, 'ParentCategoryId' : 0, 'TotalPostCount' : 4000 } result = getHtml(url,value) return result |
其實博客園這個請求還是挺標準的,哈哈正好適合抓取。因為他返回的就是一段html。(如果返回json那不是更好。。。。)
上文已經(jīng)提到了,用到的是BeautifulSoup,好處就是不用自己寫正則,只要根據(jù)他的語法來寫就好了,在多次的測試之后終于完成了數(shù)據(jù)的解析。先上一段HTML。然后在對應下面的代碼,也許看起來更輕松一些。
1
Python 字符串格式化
src="http://pic.cnblogs.com/face/795666/20160421231717.png" alt="" /> 轉載請注明出處 Python2.6+ 增加了str.format函數(shù),用來代替原有的'%'操作符
。它使用比'%'更加直觀、靈活。下面詳細介紹一下它的使用方法。 下面是使用'%'的例子: 格式很像C語言的printf是不是?由于'%'是一個操作符,只能在左右
兩邊各放一個參數(shù),因此右邊多個值需要用元組或 ...
|
通過上文的HTML代碼可以看到幾點。首先每一條數(shù)據(jù)都在 div(class=”post_item”)下。然后 div(“post_item_body”)下有用戶信息,標題,鏈接,簡介等信息。逐一根據(jù)樣式解析即可。代碼如下:廈門租叉車公司
from bs4 import BeautifulSoup import request import re
#解析最外層 def blogParser(index):
cnblogs = request.requestCnblogs(index) soup = BeautifulSoup(cnblogs, 'html.parser') all_div = soup.find_all('div', attrs={'class': 'post_item_body'}, limit=20)
blogs = [] #循環(huán)div獲取詳細信息 for item in all_div: blog = analyzeBlog(item) blogs.append(blog)
return blogs
#解析每一條數(shù)據(jù) def analyzeBlog(item): result = {} a_title = find_all(item,'a','titlelnk') if a_title is not None: # 博客標題 result["title"] = a_title[0].string # 博客鏈接 result["href"] = a_title[0]['href'] p_summary = find_all(item,'p','post_item_summary') if p_summary is not None: # 簡介 result["summary"] = p_summary[0].text footers = find_all(item,'div','post_item_foot') footer = footers[0] # 作者 result["author"] = footer.a.string # 作者url result["author_url"] = footer.a['href'] str = footer.text time = re.findall(r"發(fā)布于 .+? .+? ", str) result["create_time"] = time[0].replace('發(fā)布于 ','')
comment_str = find_all(footer,'span','article_comment')[0].a.string result["comment_num"] = re.search(r'\d+', comment_str).group()
view_str = find_all(footer,'span','article_view')[0].a.string result["view_num"] = re.search(r'\d+', view_str).group()
return result
def find_all(item,attr,c): return item.find_all(attr,attrs={'class':c},limit=1) |
上邊一堆代碼下來,著實花費了我不少時間,邊寫邊調(diào)試,邊百度~~不過還好最終還是出來了。等數(shù)據(jù)都整理好之后,然后我把它保存到了txt文件里面,以供其他語言來處理。本來想寫個put直接put到ElasticSearch中,奈何沒成功。后邊在試吧,畢竟我的重點只是導數(shù)據(jù),不在抓取這里。
import match import os import datetime import json
def writeToTxt(list_name,file_path): try: #這里直接write item 即可,不要自己給序列化在寫入,會導致json格式不正確的問題 fp = open(file_path,"w+",encoding='utf-8') l = len(list_name) i = 0 fp.write('[') for item in list_name: fp.write(item) if i fp.write(',\n') i += 1 fp.write(']') fp.close() except IOError: print("fail to open file") #def getStr(item): # return json.dumps(item).replace('\'','\"')+',\n' def saveBlogs(): for i in range(1,2): print('request for '+str(i)+'...') blogs = match.blogParser(i,5) #保存到文件 path = createFile() writeToTxt(blogs,path+'/blog_'+ str(i) +'.json') print('第'+ str(i) +'頁已經(jīng)完成') return 'success' def createFile(): date = datetime.datetime.now().strftime('%Y-%m-%d') path = '/'+date if os.path.exists(path): return path else: os.mkdir(path) return path result = saveBlogs() print(result) |
以上就是“Python爬蟲實例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。