標籤:append date request return mpi ace creat def 分析
準備:
1.扒網頁,根據URL來擷取網頁資訊
import urllib.parseimport urllib.requestresponse = urllib.request.urlopen("https://www.cnblogs.com")print(response.read())
urlopen方法
urlopen(url, data, timeout)
url即為URL,data是訪問URL時要傳送的資料,timeout是設定逾時時間
返回response對象
response對象的read方法,可以返回擷取到的網頁內容
POST
import urllib.parseimport urllib.requestvalues = {"username":"XXX","password":"XXX"}data = urllib.parse.urlencode(values) data = data.encode(‘utf-8‘)url = "https://passport.cnblogs.com/user/signin?ReturnUrl=https://home.cnblogs.com/&AspxAutoDetectCookieSupport=1"response = urllib.request.urlopen(url,data)print(response.read())
GET
import urllib.parseimport urllib.requestvalues = {"itemCount":30}data = urllib.parse.urlencode(values) data = data.encode(‘utf-8‘)url = "https://news.cnblogs.com/CommentAjax/GetSideComments"data = urllib.parse.urlencode(values)response = urllib.request.urlopen(url+‘?‘+data)print(response.read())
2.Regexre模組
Python 內建了re模組,提供了對Regex的支援
#返回pattern對象re.compile(string[,flag]) #以下為匹配所用函數re.match(pattern, string[, flags]) #在字串中尋找,是否能匹配Regexre.search(pattern, string[, flags]) #字串的開頭是否能匹配Regexre.split(pattern, string[, maxsplit]) #通過Regex將字串分離re.findall(pattern, string[, flags]) #找到 RE 匹配的所有子串,並把它們作為一個列表返回re.finditer(pattern, string[, flags]) #找到 RE 匹配的所有子串,並把它們作為一個迭代器返回re.sub(pattern, repl, string[, count]) #找到 RE 匹配的所有子串,並將其用一個不同的字串替換re.subn(pattern, repl, string[, count])#返回 (sub(repl, string[, count]), 替換次數)
3.Beautiful Soup,是從網頁抓取資料的庫,使用時需要匯入 bs4 庫
詳細
4.MongoDB
使用的MongoEngine庫
詳細
樣本:
抓取部落格園資料,儲存到MongoDB中
1.擷取部落格園的資料
request.py
import urllib.parseimport urllib.requestdef getHtml(url): response_result = urllib.request.urlopen(url).read() html = response_result.decode(‘utf-8‘) return htmldef requestCnblogs(num): print(‘請求資料page:‘,num) url = ‘https://www.cnblogs.com/#p‘+str(num) result = getHtml(url) return result
註:
觀察url
第一頁https://www.cnblogs.com
第二頁https://www.cnblogs.com/#p2
2.解析擷取來的資料
deal.py
from bs4 import BeautifulSoupimport requestimport redef 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 = [] #迴圈div擷取詳細資料 for item in all_div: blog = analyzeBlog(item) blogs.append(blog) return blogs def analyzeBlog(item): result = {} a_title = find_all(item,‘a‘,‘titlelnk‘) if a_title is not None: # 部落格標題 result["title"] = a_title[0].string # 部落格連結 result["link"] = 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 str = footer.text time = re.findall(r"發佈於 .+? .+? ", str) result["create_time"] = time[0].replace(‘發佈於 ‘,‘‘) return result def find_all(item,attr,c): return item.find_all(attr,attrs={‘class‘:c},limit=1)
註:
分析html結構
3.將處理好的資料儲存到MongoDB
db.py
from mongoengine import *connect(‘test‘, host=‘localhost‘, port=27017)import datetimeclass Blogs(Document): title = StringField(required=True, max_length=200) link = StringField(required=True) author = StringField(required=True) summary = StringField(required=True) create_time = StringField(required=True)def savetomongo(contents): for content in contents: blog = Blogs( title=content[‘title‘], link= content[‘link‘], author=content[‘author‘], summary=content[‘summary‘], create_time=content[‘create_time‘] ) blog.save() return "ok" def haveBlogs(): blogs = Blogs.objects.all() return len(blogs)
4.開始抓取資料
test.py
import dbimport dealprint("start.......")for i in range(1, 21): contents = deal.blogParser(i) db.savetomongo(contents) print(‘page‘,i,‘ OK.‘)counts = db.haveBlogs()print("have ",counts," blogs")print("end.......")
註:
當前使用的Python版本是3.6.1
用Python寫簡單的爬蟲