用Python寫簡單的爬蟲

來源:互聯網
上載者:User

標籤: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寫簡單的爬蟲

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.