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()

爬取的结果
在这里插入图片描述
第一次写博客,主要是为了记录自己第一次成功爬虫,也是为了分享给有需要的人,可能有些理解有错误的地方,请大家批评指正,谢谢!

猜你喜欢

转载自blog.csdn.net/qq_16246781/article/details/83821875