十幾年來總結的最經典的專案,用來作為python爬蟲實踐教學!
一、前言
這篇文章之前是給新人培訓時用的,大家覺的挺好理解的,所以就分享出來,與大家一起學習。如果你學過一些python,想用它做些什麼又沒有方向,不妨試試完成下面幾個案例。
二、環境準備
安裝requests lxml beautifulsoup4 三個庫(下面程式碼均在python3.5環境下通過測試)
pip install requests lxml beautifulsoup4
三、幾個爬蟲小案例
-
獲取本機公網IP地址
-
利用百度搜尋介面,編寫url採集器
-
自動下載搜狗桌布
-
自動填寫調查問卷
-
獲取公網代理IP,並判斷是否能用、延遲
3.1 獲取本機公網IP地址
利用公網上查詢IP的藉口,使用python的requests庫,自動獲取IP地址。
import requests r = requests.get("http://2017.ip138.com/ic.asp") r.encoding = r.apparent_encoding #使用requests的字元編碼智慧分析,避免中文亂碼 print(r.text) # 你還可以使用正則匹配re模組提取出IP import re print(re.findall("d{1,3}.d{1,3}.d{1,3}.d{1,3}",r.text))
3.2 利用百度搜尋介面,編寫url採集器
這個案例中,我們要使用requests結合BeautifulSoup庫來完成任務。我們要在程式中設定User-Agent頭,繞過百度搜尋引擎的反爬蟲機制(你可以試試不加User-Agent頭,看看能不能獲取到資料)。注意觀察百度搜尋結構的URL連結規律,例如第一頁的url連結引數pn=0,第二頁的url連結引數pn=10…. 依次類推。這裡,我們使用css選擇器路徑提取資料。
import requests from bs4 import BeautifulSoup # 設定User-Agent頭,繞過百度搜尋引擎的反爬蟲機制 headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'} # 注意觀察百度搜尋結構的URL連結規律,例如第一頁pn=0,第二頁pn=10.... 依次類推,下面的for迴圈搜尋前10頁結果 for i in range(0,100,10): bd_search = "https://www.baidu.com/s?wd=inurl:/dede/login.php?&pn=%s" % str(i) r = requests.get(bd_search,headers=headers) soup = BeautifulSoup(r.text,"lxml") # 下面的select使用了css選擇器路徑提取資料 url_list = soup.select(".t > a") for url in url_list: real_url = url["href"] r = requests.get(real_url) print(r.url)
編寫好程式後,我們使用關鍵詞inurl:/dede/login.php 來批量提取織夢cms的後臺地址,效果如下:
3.3 自動下載搜狗桌布
這個例子,我們將通過爬蟲來自動下載搜過桌布,程式中存放圖片的路徑改成你自己想要存放圖片的目錄路徑即可。還有一點,程式中我們用到了json庫,這是因為在觀察中,發現搜狗桌布的地址是以json格式存放,所以我們以json來解析這組資料。
import requests import json #下載圖片 url = "http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E6%B8%B8%E6%88%8F&start=0&len=15&width=1366&height=768" r = requests.get(url) data = json.loads(r.text) for i in data["all_items"]: img_url = i["pic_url"] # 下面這行裡面的路徑改成你自己想要存放圖片的目錄路徑即可 with open("/home/evilk0/Desktop/img/%s" % img_url[-10:]+".jpg","wb") as f: r2 = requests.get(img_url) f.write(r2.content) print("下載完畢:",img_url)
3.4 自動填寫調查問卷
目標官網:https://www.wjx.cn
目標問卷:https://www.wjx.cn/jq/21581199.aspx
import requests import random url = "https://www.wjx.cn/joinnew/processjq.ashx?submittype=1&curID=21581199&t=1521463484600&starttime=2018%2F3%2F19%2020%3A44%3A30&rn=990598061.78751211" data = { "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s" } header = { "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)", "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471", } for i in range(0,500): choice = ( random.randint(1, 2), random.randint(1, 4), random.randint(1, 3), random.randint(1, 4), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), ) data["submitdata"] = data["submitdata"] % choice r = requests.post(url = url,headers=header,data=data) print(r.text) data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s"
當我們使用同一個IP提交多個問卷時,會觸發目標的反爬蟲機制,伺服器會出現驗證碼。
我們可以使用X-Forwarded-For來偽造我們的IP,修改後程式碼如下:
import requests import random url = "https://www.wjx.cn/joinnew/processjq.ashx?submittype=1&curID=21581199&t=1521463484600&starttime=2018%2F3%2F19%2020%3A44%3A30&rn=990598061.78751211" data = { "submitdata" : "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s" } header = { "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko)", "Cookie": ".ASPXANONYMOUS=iBuvxgz20wEkAAAAZGY4MDE1MjctNWU4Ni00MDUwLTgwYjQtMjFhMmZhMDE2MTA3h_bb3gNw4XRPsyh-qPh4XW1mfJ41; spiderregkey=baidu.com%c2%a7%e7%9b%b4%e8%be%be%c2%a71; UM_distinctid=1623e28d4df22d-08d0140291e4d5-102c1709-100200-1623e28d4e1141; _umdata=535523100CBE37C329C8A3EEEEE289B573446F594297CC3BB3C355F09187F5ADCC492EBB07A9CC65CD43AD3E795C914CD57017EE3799E92F0E2762C963EF0912; WjxUser=UserName=17750277425&Type=1; LastCheckUpdateDate=1; LastCheckDesign=1; DeleteQCookie=1; _cnzz_CV4478442=%E7%94%A8%E6%88%B7%E7%89%88%E6%9C%AC%7C%E5%85%8D%E8%B4%B9%E7%89%88%7C1521461468568; jac21581199=78751211; CNZZDATA4478442=cnzz_eid%3D878068609-1521456533-https%253A%252F%252Fwww.baidu.com%252F%26ntime%3D1521461319; Hm_lvt_21be24c80829bd7a683b2c536fcf520b=1521461287,1521463471; Hm_lpvt_21be24c80829bd7a683b2c536fcf520b=1521463471", "X-Forwarded-For" : "%s" } for i in range(0,500): choice = ( random.randint(1, 2), random.randint(1, 4), random.randint(1, 3), random.randint(1, 4), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), random.randint(1, 3), ) data["submitdata"] = data["submitdata"] % choice header["X-Forwarded-For"] = (str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+(str(random.randint(1,255))+".")+str(random.randint(1,255)) r = requests.post(url = url,headers=header,data=data) print(header["X-Forwarded-For"],r.text) data["submitdata"] = "1$%s}2$%s}3$%s}4$%s}5$%s}6$%s}7$%s}8$%s}9$%s}10$%s" header["X-Forwarded-For"] = "%s"
效果圖:
關於這篇文章,因為之前寫過,不贅述,感興趣直接看: 【如何通過Python實現自動填寫調查問卷】
3.5 獲取公網代理IP,並判斷是否能用、延遲時間
這一個例子中,我們想爬取 【西刺代理】上的代理IP,並驗證這些代理的存活性以及延遲時間。(你可以將爬取的代理IP新增進proxychain中,然後進行平常的滲透任務。)這裡,我直接呼叫了linux的系統命令ping -c 1 " + ip.string + " | awk 'NR==2{print}' - ,如果你想在Windows中執行這個程式,需要修改倒數第三行os.popen中的命令,改成Windows可以執行的即可。
from bs4 import BeautifulSoup import requests import os url = "http://www.xicidaili.com/nn/1" headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36'} r = requests.get(url=url,headers=headers) soup = BeautifulSoup(r.text,"lxml") server_address = soup.select(".odd > td:nth-of-type(4)") ip_list = soup.select(".odd > td:nth-of-type(2)") ports = soup.select(".odd > td:nth-of-type(3)") for server,ip in zip(server_address,ip_list): if len(server.contents) != 1: print(server.a.string.ljust(8),ip.string.ljust(20), end='') else: print("未知".ljust(8), ip.string.ljust(20), end='') delay_time = os.popen("ping -c 1 " + ip.string + " | awk 'NR==2{print}' -") delay_time = delay_time.read().split("time=")[-1].strip(" ") print("time = " + delay_time)
四、結語
當然,你還可以用python幹很多有趣的事情。
相關文章
- 十幾年來總結的最經典的專案,用來做python爬蟲實踐教學!Python爬蟲
- 爬蟲專案總結爬蟲
- Django用來作為爬蟲框架淺談Django爬蟲框架
- python爬蟲實操專案_Python爬蟲開發與專案實戰 1.6 小結Python爬蟲
- Python零基礎爬蟲教學(實戰案例手把手Python爬蟲教學)Python爬蟲
- github上的python爬蟲專案_GitHub - ahaharry/PythonCrawler: 用python編寫的爬蟲專案集合GithubPython爬蟲
- Python爬蟲開發與專案實踐(3)Python爬蟲
- Python網路爬蟲實戰專案大全 32個Python爬蟲專案demoPython爬蟲
- 不踩坑的Python爬蟲:Python爬蟲開發與專案實戰,從爬蟲入門 PythonPython爬蟲
- python爬蟲-33個Python爬蟲專案實戰(推薦)Python爬蟲
- 【Python學習實踐教程】10個Python經典專案實戰,練手必備Python
- python爬蟲例項專案大全-GitHub 上有哪些優秀的 Python 爬蟲專案?Python爬蟲Github
- Python爬蟲入門學習實戰專案(一)Python爬蟲
- 送給Python小白學習爬蟲的小專案Python爬蟲
- Python《爬蟲初實踐》Python爬蟲
- python爬蟲初探--第一個python爬蟲專案Python爬蟲
- Python專案實踐有什麼好處?python用來做什麼Python
- 影像分類:來自13個Kaggle專案的經驗總結
- 32個Python爬蟲實戰專案,滿足你的專案慌Python爬蟲
- Python學習筆記——爬蟲之Scrapy專案實戰Python筆記爬蟲
- Java十大經典排序演算法最強總結Java排序演算法
- 一入爬蟲深似海,總結python爬蟲學習筆記!爬蟲Python筆記
- (python)爬蟲----八個專案帶你進入爬蟲的世界Python爬蟲
- Python網路爬蟲實戰小專案Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- 網路爬蟲(python專案)爬蟲Python
- 專案--python網路爬蟲Python爬蟲
- 使用python的scrapy來編寫一個爬蟲Python爬蟲
- python爬蟲是什麼?爬蟲可以分為哪幾類?Python爬蟲
- 十大經典排序演算法最強總結(含JAVA程式碼實現)排序演算法Java
- 使用 Golang 寫爬蟲經驗總結Golang爬蟲
- 70個Python經典實用練手專案(附原始碼)Python原始碼
- Python爬蟲開發與專案實戰pdfPython爬蟲
- Python爬蟲開發與專案實戰(2)Python爬蟲
- Python爬蟲開發與專案實戰(1)Python爬蟲
- Python靜態網頁爬蟲專案實戰Python網頁爬蟲
- 【Python學習】爬蟲爬蟲爬蟲爬蟲~Python爬蟲
- Python培訓分享:python爬蟲可以用來做什麼?Python爬蟲