亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python全站爬蟲知識點詳解

2019-11-06 06:29:51
字體:
來源:轉載
供稿:網友

1 最簡單的單頁面抓取 思路: 獲取頁面所有url 對獲取的所有url進行分類 A 獲取屬于本域名下的url B 獲取屬于其他url

2 用到的模塊 urllib 詳細介紹見鏈接 http://blog.csdn.net/dolphin_h/article/details/45296353

bs4 詳細介紹見鏈接 http://blog.csdn.net/winterto1990/article/details/47624167

re正則表達式 詳細介紹見鏈接 http://blog.csdn.net/winterto1990/article/details/47624167

3 一下代碼出自freebuf文章,鏈接 http://www.freebuf.com/news/topnews/96821.html

代碼說明:

import urllibfrom bs4 import BeautifulSoupimport redef get_all_url(url): urls = [] web = urllib.urlopen(url)#使用urllib模塊的urlopen函數打開url,復制給websoup =BeautifulSoup(web.read())#將web內容轉化為beautigulsoup格式的數據。#通過正則過濾合理的url(針對與freebuf.com來講) tags_a =soup.findAll(name='a',attrs={'href':re.compile("^https?://")}) #soup.findall函數的運用,配合正則表達式來過濾url try : for tag_a in tags_a:#re:^ 表示匹配字符串開頭例如,^ abc 匹配 abc ? 表示匹配前一個字符串0次或1次,例如 abc? 匹配 ab 和 abc #return urls except: pass return urls#得到所有freebuf.com下的urldef get_local_urls(url): local_urls = [] urls = get_all_url(url) for _url in urls: ret = _url if 'freebuf.com' in ret.replace('//','').split('/')[0]: local_urls.append(_url) return local_urls #if 'freebuf.com' in ret.replace('//','').split('/')[0]:這個if語句不是很明白,通過split()函數,把域名分割,獲取分割后組成的類表的第一個字符串。但是在分割前為什么要把//替換成空格???#得到所有的不是freebuf.com域名的urldef get_remote_urls(url): remote_urls = [] urls = get_all_url(url) for _url in urls: ret = _url if "freebuf.com" not in ret.replace('//','').split('/')[0]: remote_urls.append(_url) return remote_urls #主函數def __main__(): url = 'http://freebuf.com/' rurls = get_remote_urls(url) 上面是單獨對一個頁面抓取。如果對整個站點抓取的話,還設計到url的處理,用作者的原話: 我們可以把整站當成一個錯綜復雜的圖結構,有一些算法基礎的讀者都會知道圖的簡單遍歷方法:dfs和bfs(深度優先和廣度優先)。如果這里讀者有問題的話建議先去學習一下這兩種算法。大體的算法結構我們清楚了,但是在實現中我們顯然需要特殊處理url,需要可以區分當前目標站點域名下的網站和其他域名的網站,除此之外,在href的值中經常會出現相對url,這里也要特別處理。 下面是代碼:

import urllibfrom bs4 import BeautifulSoupimport urlparseimport timeimport urllib2 #urllib 和 urllib2的區別http://blog.csdn.net/dolphin_h/article/details/45296353url = "http://xxxx.xx/"domain = "xxxx.xx"deep = 0tmp = ""sites = set()visited = set()#local = set()#集合:python的set和其他語言類似, 是一個無序不重復元素集, 基本功能包括關系測試和消除重復元素. 集合對象還支持union(聯合), intersection(交), difference(差)和sysmmetric difference(對稱差集)等數學運算. def get_local_pages(url,domain): global deep global sites global tmp repeat_time = 0 pages = set() #防止url讀取卡住 while True: try: print "Ready to Open the web!" time.sleep(1) #time.sleep()函數, Python time sleep() 函數推遲調用線程的運行,可通過參數secs指秒數,表示進程掛起的時間 print "Opening the web", url web = urllib2.urlopen(url=url,timeout=3) print "Success to Open the web" break except: print "Open Url Failed !!! Repeat" time.sleep(1) repeat_time = repeat_time+1 if repeat_time == 5: return #上面整段判斷url能不能打開 print "Readint the web ..." soup = BeautifulSoup(web.read()) print "..."#提取標簽 a for tag in tags: #避免參數傳遞異常 try: ret = tag['href'] except: print "Maybe not the attr : href" continue o = urlparse.urlparse(ret) #urlparse.urlparse函數的使用 urlparse模塊主要是把url拆分為6部分,并返回元組。并且可以把拆分后的部分再組成一個url。主要有函數有urljoin、urlsplit、urlunsplit、urlparse等。 urlparse.urlparse(urlstring[, scheme[, allow_fragments]]) 將urlstring解析成6個部分,它從urlstring中取得URL,并返回元組 (scheme, netloc, path, parameters, query, fragment),但是實際上是基于namedtuple,是tuple的子類。它支持通過名字屬性或者索引訪問的部分URL,每個
組件是一串字符,也有可能是空的。組件不能被解析為更小的部分,%后面的也不會被解析,分割符號并不是解析結果的一部分,除非用斜線轉義,注意,返回的這個元組非常有用,例如可以用來確定網絡協議(HTTP、FTP等等 )、服務器地址、文件路徑,等等。 """ #Debug I/O for _ret in o: if _ret == "": pass else: print _ret """ #處理相對路徑url if o[0] is "" and o[1] is "": print "Fix Page: " +ret url_obj = urlparse.urlparse(web.geturl()) #獲取web頁面的url,用urlparse函數抽離 ret = url_obj[0] + "://" + url_obj[1] + url_obj[2] + ret #組成一個絕對url #保持url的干凈 ret = ret[:8] + ret[8:].replace('//','/') o = urlparse.urlparse(ret) #這里不是太完善,但是可以應付一般情況 if '../' in o[2]: paths = o[2].split('/') for i inrange(len(paths)): if paths[i] == '..': paths[i] = '' if paths[i-1]: paths[i-1] = '' tmp_path = '' for path in paths: if path == '': continue tmp_path = tmp_path + '/' +path ret =ret.replace(o[2],ret_path) print "FixedPage: " + ret 上面整段都是判斷獲到的url是絕對url還是相對url。如果是相對url,則還需進行重組成完善的絕對url。包括url中含../的情況進行處理。但是處理../的情況不理解!!??? #協議處理 if 'http' not in o[0]: print "Bad Page:" + ret.encode('ascii') continue #url合理性檢驗 if o[0] is "" and o[1] is not "": print "Bad Page: " +ret continue #域名檢驗 if domain not in o[1]: #變量domain用來檢驗獲取的所有url是否是改域名下的 print "Bad Page: " +ret continue #整理,輸出 newpage = ret if newpage not in sites: print "Add New Page: " + newpage pages.add(newpage) return pages#dfs算法遍歷全站def dfs(pages): #無法獲取新的url說明便利完成,即可結束dfs if pages is set(): return global url global domain global sites global visited sites = set.union(sites,pages) for page in pages: if page not in visited: print "Visiting",page visited.add(page) url = page pages = get_local_pages(url, domain) dfs(pages) print "sucess" #整段程序下來,一直不知道 變量domain用來檢驗獲取的所有url是否是改域名下的pages = get_local_pages(url, domain)dfs(pages)for i in sites:print i

整個的大概思路是: 傳入url 判斷能否打開 打開url,獲取整個改url的web信息 提取屬性‘href’ 遍歷提取到的鏈接,這里叫做url2 判斷url是否為相對url 是的話 對其進行抽離[urlparse.urlparse()] 重組 (處理相對url) 最后檢驗協議、url域名。 帶入遍歷算法。

最后是web元素的處理 兩個模塊 bs4模塊和docx模塊的使用 **bs4前面有寫 我們重點要講findAll方法的兩個參數:name和attr** Name: 指的是標簽名,傳入一個標簽名的名稱就可以返回所有固定名稱的標簽名

Attr: 是一個字典存儲需要查找的標簽參數,返回對應的標簽

Tag.children 表示獲取tag標簽的所有子標簽

Tag.string 表示獲取tag標簽內的所有字符串,不用一層一層索引下去尋找字符串

Tag.attrs[key] 表示獲取tag標簽內參數的鍵值對鍵為key的值

Tag.img 表示獲取tag標簽的標簽名為img的自標簽(一個)

docx模塊: 在使用這個模塊的時候,要記清楚如果:

pip install python-docx

easy_install python-docx

兩種方式安裝都不能正常使用的話,就需要下載tar包自己手動安裝

Docx模塊是一個可以直接操作生成docx文檔的python模塊,使用方法極盡簡單:

Demo = Document() #在內存中建立一個doc文檔

Demo.add_paragraph(data) #在doc文檔中添加一個段落

Demo.add_picture(“pic.png”) #doc文檔中添加一個圖片

Demo.save(‘demo.docx’) #存儲docx文檔

觀察html結構:

b4.png這里寫圖片描述

我們大致觀察一下結構,定位到文章的具體內容需要找到標簽,然后再遍歷標簽的子標簽即可遍歷到所有的段落,配圖資料

b5.png這里寫圖片描述

這樣定位到圖片,那么我們怎么樣來尋找

from docx import Documentfrom bs4 import BeautifulSoupimport urlliburl ="http://freebuf.com/news/94263.html"data = urllib.urlopen(url)document = Document()soup = BeautifulSoup(data)article = soup.find(name ="div",attrs={'id':'contenttxt'}).children#這段是提取我們所要的信息for e in article: try: if e.img: pic_name = '' print e.img.attrs['src'] if 'gif' in e.img.attrs['src']: pic_name = 'temp.gif' elif 'png' in e.img.attrs['src']: pic_name = 'temp.png' elif 'jpg' in e.img.attrs['src']: pic_name = 'temp.jpg' else: pic_name = 'temp.jpeg' urllib.urlretrieve(e.img.attrs['src'], filename=pic_name) #下面我們再來看看 urllib 模塊提供的 urlretrieve() 函數。urlretrieve() 方法直接將遠程數據下載到本地。#1>>> help(urllib.urlretrieve)#2Help on function urlretrieve in module urllib:#3#4urlretrieve(url, filename=None, reporthook=None, data=None)#參數 finename 指定了保存本地路徑(如果參數未指定,urllib會生成一個臨時文件保存數據。)#參數 reporthook 是一個回調函數,當連接上服務器、以及相應的數據塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示當前的下載進度。#參數 data 指 post 到服務器的數據,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示服務器的響應頭。 document.add_picture(pic_name) except: pass if e.string: print e.string.encode('gbk','ignore') document.add_paragraph(e.string)document.save("freebuf_article.docx")print "success create a document"

主要是作為筆記,記錄個人學習過程。 大部分內容


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩av高清| 成人情趣片在线观看免费| 91精品国产91久久久久久久久| www国产精品视频| 久久久久久久999| 国产丝袜精品第一页| 久久九九免费视频| 欧美激情免费看| 久久青草精品视频免费观看| 亚洲欧美一区二区精品久久久| 欧美在线一级va免费观看| 91在线中文字幕| 国产成人精品在线播放| 搡老女人一区二区三区视频tv| 日韩在线视频观看正片免费网站| 亚洲色图五月天| 福利二区91精品bt7086| 国产精品亚洲欧美导航| 久久久久久久久久婷婷| 国产精品一区二区三区在线播放| 欧美精品久久久久久久久| 国产精品免费小视频| 亚洲一区二区中文字幕| 欧美二区在线播放| 国产一区二区三区在线观看视频| 国产精品一区二区三区久久| 欧美激情一区二区三区在线视频观看| 精品国产视频在线| 亚洲欧美三级在线| 91久久国产精品91久久性色| 中文字幕久久亚洲| 日韩少妇与小伙激情| 国产在线观看精品| 亚洲www在线观看| 欧美xxxx做受欧美.88| 亚洲最新av网址| 色偷偷偷综合中文字幕;dd| 国产精品扒开腿做爽爽爽的视频| 97久久久免费福利网址| 亚洲成人免费在线视频| 在线看日韩av| 国产精品一二三视频| 国产综合久久久久| 都市激情亚洲色图| 亚洲影视中文字幕| 亚洲视频精品在线| 日韩av大片在线| 亚洲高清在线观看| 亚洲奶大毛多的老太婆| 亚洲最大福利视频网| 欧美大片欧美激情性色a∨久久| 色吧影院999| 欧美另类在线观看| 中文字幕少妇一区二区三区| 亚洲精品一区二区在线| 日韩专区中文字幕| 亚洲iv一区二区三区| 日本在线观看天堂男亚洲| 国产一区二区在线免费视频| 成人有码视频在线播放| 91视频国产精品| 欧美诱惑福利视频| 国产精品www| 亚洲欧洲偷拍精品| 午夜精品久久久久久久99黑人| 欧美亚洲成人网| 欧美激情欧美激情在线五月| 欧美极品美女视频网站在线观看免费| 亚洲欧美福利视频| 精品一区二区三区电影| 亚洲成人av片在线观看| 国产成人jvid在线播放| 亚洲成av人片在线观看香蕉| 国产精品一二三在线| 尤物tv国产一区| 亚洲国产精品悠悠久久琪琪| 国内成人精品视频| 亚洲xxxx妇黄裸体| 国产精品三级美女白浆呻吟| 日韩一区二区精品视频| 欧美精品在线看| 亚洲成色999久久网站| 国产精品黄色影片导航在线观看| 性欧美暴力猛交69hd| 亚洲国产精品大全| 亚洲成人精品久久久| 亚洲精品网站在线播放gif| 亚洲第一男人天堂| 日韩av免费在线| 国产精品最新在线观看| 欧美夫妻性生活视频| 日本国产一区二区三区| 欧美性xxxxhd| 日韩精品免费一线在线观看| 欧美视频中文字幕在线| 国产精品99久久久久久久久| 欧美裸体xxxx极品少妇| 日韩精品在线观看一区二区| 美乳少妇欧美精品| 久热国产精品视频| 亚洲成人网在线观看| 欧美精品video| 久久亚洲精品毛片| 国产mv免费观看入口亚洲| 97国产精品人人爽人人做| 国产一区二区三区视频免费| 爱福利视频一区| 欧美大片在线影院| 午夜精品久久久久久99热| 国产精品一区专区欧美日韩| 精品综合久久久久久97| 欧美成人免费大片| 大荫蒂欧美视频另类xxxx| 亚洲国产欧美在线成人app| 成人久久久久久| 亚洲天堂av在线免费观看| 免费不卡在线观看av| 中文字幕精品网| 久久久久五月天| 中文字幕亚洲色图| 综合久久五月天| 欧美综合国产精品久久丁香| 国产精品私拍pans大尺度在线| 麻豆一区二区在线观看| 91精品久久久久久久久久久久久| 日韩视频欧美视频| 精品久久久中文| 北条麻妃久久精品| 国产成人精品电影| 日韩av在线免费观看一区| 日韩激情在线视频| 91伊人影院在线播放| 18一19gay欧美视频网站| 欧美激情久久久| 欧美成人午夜激情在线| 亚洲欧美一区二区三区久久| 欧美日韩国产91| 中日韩美女免费视频网站在线观看| 色偷偷亚洲男人天堂| 国产一区二区三区免费视频| 欧美wwwxxxx| 黄色成人av在线| 中文字幕欧美亚洲| 日韩高清av一区二区三区| 日韩电视剧在线观看免费网站| 亚洲欧美激情在线视频| 成人激情视频在线播放| 成人网中文字幕| 91久久久久久久久久久| 91色p视频在线| 亚洲精品久久久久久久久久久久久| 亚洲综合中文字幕在线观看| 69视频在线免费观看| 国产精品久久综合av爱欲tv| 国产欧洲精品视频| 亚洲国产成人精品久久久国产成人一区| 国产亚洲精品91在线| 久久在线精品视频| 亚洲电影第1页| 国产精品一二三在线| 欧美亚洲在线视频| 久久久久亚洲精品国产| 久久亚洲国产精品成人av秋霞| 久久精品亚洲国产|