利用百度搜集子域名--爬蟲技巧
問題引入:
1. 何為子域名?
答:子域名是相對於網站的主域名的。比如百度的主域名為:baidu.com,這是一個頂級域名,而在頂級域名前由”.”隔開加上不同的字符,比如zhidao.baidu.com,那么這就是一個二級域名,同理,繼續擴展主域名的主機名,如jian.news.baidu.com,這就是一個三級域名,依次類推。
2. 手動收集子域名是怎樣的一種過程?
舉個例子,比如我們要收集qq.com這個主域名,在百度搜索引擎能夠搜索到的所有子域名。
首先,使用搜索域名的語法 搜索~
搜索域名語法:site:qq.com
然后,在搜索結果中存在我們要的子域名信息,我們可以右鍵,查看元素,復制出來。
3. 如何用python替代手工的繁瑣操作?
其實就是將手工收集用代碼來實現自動化,手工收集的步驟:
下面就是利用爬蟲技巧把查詢到的子域名都給爬下來。
1. 發起一個搜索的http請求
請求我們使用python的第三方http庫,requests
需要額外安裝,可以使用pip進行安裝 pip install requests
requests 基本使用-example:
help(requests) 查看requests的幫助手冊 。
dir(requests) 查看requests這個對象的所有屬性和方法 。
requests.get(‘http://www.baidu.com‘)發起一個GET請求。
好了,補充基礎知識,我們來發起一個請求,並獲得返回包的內容。
#coding=utf-8
import re
import requests
url = 'http://www.baidu.com/s?wd=site:qq.com' #設定url請求
response = requests.get(url).content #get請求,content獲取返回包正文
print response
返回包的內容實在太多,我們需要找到我們想要的子域名,然后復制出來。
從查看元素我們可以發現,子域名被一段代碼包裹着,如下:
style=”text-decoration:none;”>www.qq.com/ </a>
2. 正則表達式——(.*?)
正則 規則:style=”text-decoration:none;”>(.*?)/
正則表達式難嗎?難。復雜嗎?挺復雜的。
然而最簡單的正則表達式,我們把想要的數據用(.*?)來表示即可。
re 基本使用-example:
假設我們要從一串字符串’123xxIxx123xxLikexx123xxStudyxx’取出ILike Study,我們可以這么寫:
eg=’123xxIxx123xxLikexx123xxStudyxx’
print re.findall(‘xx(.*?)xx’,eg)
#打印結果
['I', 'Like', 'Study']
基於上述例子,獲取子域名。
#coding=utf-8
import re
import requests
url = 'http://www.baidu.com/s?wd=site:qq.com' #設定url請求
response = requests.get(url).content #get請求,content獲取返回包正文
baidudomain = re.findall('style="text-decoration:none;">(.*?)/',response)
print baidudomain
3. 翻頁的處理
上面獲得的子域名,僅僅只是返回結果的第一頁內容,如何獲取所有頁面的結果?
url=”http://www.baidu.com.cn/s?wd=site:qq.com&pn=0″
url=”http://www.baidu.com.cn/s?wd=site:qq.com&pn=10″
url=”http://www.baidu.com.cn/s?wd=site:qq.com&pn=20″
...
#pn=0為第一頁,pn=10為第2頁,pn=20為第3頁…
這個時候用循環來實現。
for i in range(100): #假設有100頁
i=i*10
url="http://www.baidu.com.cn/s?wd=site:qq.com&pn=%s" %i
4. 重復項太多?想去重?
基礎知識:
python的數據類型: set
set持有一系列的元素,但是set的元素沒有重復項,且是無序的。
創建set的方式是調用set()並傳入一個list,list的元素將作為set的元素。
sites=list(set(sites)) #用set實現去重
正則表達式匹配得到的是一個列表list,我們調用set()方法即可實現去重。
5. 完整代碼&&總結
下面是百度搜索引擎爬取子域名的完整代碼。
#coding=utf-8
import re
import requests
sites = []
for i in range(0,10): #10頁為例
i = i*10
url = 'http://www.baidu.com/s?wd=site:qq.com&pn=%s' %i #設定url請求
response = requests.get(url).content #get請求,content獲取返回包正文
baidudomain = re.findall('style="text-decoration:none;">(.*?)/',response)
sites += list(baidudomain)
site = list(set(sites)) #set()實現去重
print site
print "\nThe number of sites is %d" %len(site)
for i in site:
print i
一個小小的爬蟲,只不過我們是用百度的引擎來爬取,不過呢,用bing引擎爬去的數據量會比百度更多,所以建議大家使用bing,google的引擎,代碼的編寫方法和百度的大同小異就不放代碼了,給個小tip,bing搜索域名用的是domain:qq.com這個的語法哦。上面的還可以進行文件操作,直接把得到的結果輸入 txt 文件,如果有興趣還可以進行下面的操作。比如 sql 注入,用百度進行搜索,形如index.php?id=1 ,按照上面的腳本修改一下,把url鏈接都爬下來,就像上面一樣,然后寫入文件,再讀取剛剛寫入的文件的url,用進行and 1=1 ///and 1=2 進行簡單的注入檢測。這只是簡單的,當然可以在這個基礎上進行剛深入的研究,逐步實現自動化。
任重而道遠!