利用百度搜集子域名--爬蟲技巧


利用百度搜集子域名--爬蟲技巧

 

問題引入:

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 進行簡單的注入檢測。這只是簡單的,當然可以在這個基礎上進行剛深入的研究,逐步實現自動化。

 

 

 

任重而道遠!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM