1. 程式人生 > >Python爬取手機號碼前7位號段歸屬地及運營商

Python爬取手機號碼前7位號段歸屬地及運營商

最近剛好因為工作需要,邊學邊實踐了爬取手機號碼前7位號段歸屬地及運營商,感覺還是挺有用,特地拿來分享一下。

我爬取的網址是:http://www.ip138.com:8080/search.asp?mobile=
介面是這樣的
在這裡插入圖片描述

我發現輸入一個號段查詢之後的網址是這樣:http://www.ip138.com:8080/search.asp?mobile=1772798&action=mobile
就是http://www.ip138.com:8080/search.asp?mobile=+號段+&action=mobile
查詢結果如下
在這裡插入圖片描述
下面就開始寫爬蟲程式碼啦!

1.引用一些需要的包,如果沒安裝的要先pip install一下這些包哦;

# -*- coding: utf-8 -*-
import re
import bs4
import urllib.request  
from bs4 import BeautifulSoup 
import urllib.parse
import sys
import time
import socket
import os

2.建立一個要儲存爬蟲結果的檔案;

#進入工作目錄
os.chdir('C:\\Users\\Administrator\Desktop')
os.getcwd()
file=open(r"號段結果.txt",'w')

3.開啟你要查詢的號段文件;

f = open(r"查詢號段.txt")

4.設定超過時間;

socket.setdefaulttimeout(30)

5.防止反爬蟲,構造合理的HTTP請求頭;這個是根據每個人的瀏覽器不同設定的,可以檢視自己的瀏覽器。開啟瀏覽器,按F12,選取Network,按F5重新整理一下,點開Name下面隨便一個文件就可以看到User-Agent。
在這裡插入圖片描述

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"
}

6.按行讀取查詢文件內容;

search_item = f.readline()
	#如果讀取完了就退出
    if not search_item:
        print("Finished")
        break

7.抓取網頁資訊;

url = 'http://www.ip138.com:8080/search.asp?mobile='+urllib.parse.quote(search_item)+'&action=mobile'
#print(url)
#用來抓取網頁的html原始碼
html = urllib.request.urlopen(url)  
html.encoding = 'gb2312'
#用來代替正則式取原始碼中相應標籤中的內容
soup = BeautifulSoup(html, "lxml")  

8.檢視要爬取結果的位置;
在這裡插入圖片描述

res = soup.find('tr',bgcolor="#EFF1F3")
res1=res.next_sibling.next_sibling.find('td',class_="tdc2").get_text()
res1=res1.strip()
if len(res1)==0:
    province=''
    city=''
else:
     res1=res.next_sibling.next_sibling.find('td',class_="tdc2").get_text()
     province=res1.split()[0]
     if len(res1.split())==1:
         city = res1.split()[0]+'市'
     else :
         city = res1.split()[1]
type1=res.next_sibling.next_sibling.next_sibling.next_sibling.find('td',class_="tdc2").get_text()

這裡有兩個if,第一個if是如果查詢的號段歸屬地是空的就賦予空值,第二個if是要將省市拆成兩個欄位,而如果出現像北京這種沒有省的話就會報錯,所以就設定省和市都是北京。

9.整合結果;

file.write("{},{},{},{}".format(province, city, type1,search_item))
print("search result:","{},{},{},{}".format(province, city, type1,search_item))

10.防止訪問過於頻繁被阻止,要關閉網頁,並設定休眠時間;

html.close()
time.sleep(15)

11.記得關閉檔案。

f.close()
file.close()

最後附上完整程式碼

# -*- coding: utf-8 -*-
import re
import bs4
import urllib.request  
from bs4 import BeautifulSoup 
import urllib.parse
import sys
import time
import socket
import os

#先建立一個儲存爬蟲結果的檔案
#進入工作目錄
os.chdir('C:\\Users\\Administrator\Desktop')
os.getcwd()
file=open(r"號段結果.txt",'w')
#開啟你要查詢的號段文件
f = open(r"查詢號段.txt")
#設定超時時間
socket.setdefaulttimeout(30)
#防止反爬蟲,構造合理的HTTP請求頭
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"}
while True:
    #按行讀取文件
    search_item = f.readline()
	#如果讀取完了就退出
    if not search_item:
        print("Finished")
        break
    #print (search_item)
    while True:
        try:
            url = 'http://www.ip138.com:8080/search.asp?mobile='+urllib.parse.quote(search_item)+'&action=mobile'
            #print(url)
			#用來抓取網頁的html原始碼
            html = urllib.request.urlopen(url)  
            html.encoding = 'gb2312'
			#用來代替正則式取原始碼中相應標籤中的內容
            soup = BeautifulSoup(html, "lxml")  
            res = soup.find('tr',bgcolor="#EFF1F3")
            res1=res.next_sibling.next_sibling.find('td',class_="tdc2").get_text()
            res1=res1.strip()
            if len(res1)==0:
                province=''
                city=''
            else:
                res1=res.next_sibling.next_sibling.find('td',class_="tdc2").get_text()
                province=res1.split()[0]
                if len(res1.split())==1:
                    city = res1.split()[0]+'市'
                else :
                    city = res1.split()[1]
            type1 =res.next_sibling.next_sibling.next_sibling.next_sibling.find('td',class_="tdc2").get_text()
            file.write("{},{},{},{}".format(province, city, type1,search_item))
            print("search result:","{},{},{},{}".format(province, city, type1,search_item))
            html.close()
            break
        except :
            print("Failed!Please wait!")
            time.sleep(15)
f.close()
file.close()

爬取的結果
在這裡插入圖片描述
第一次寫部落格,主要是為了記錄自己第一次成功爬蟲,也是為了分享給有需要的人,可能有些理解有錯誤的地方,請大家批評指正,謝謝!