前言:本文于2017年1月23日编写,欲爬取的内容和正则都符合此时的目标网站,若网站页面html内容更改,正则内容应随之更改,本文所讲述的爬虫是爬取IP查询网站上的IP所在地,另外,阅读此文只需要一点点Python基础即可。哦,还有这里先贴代码,我觉得对照代码看博客内容会更容易理解。
爬虫代码:
#coding=utf-8
import urllib2
import urllib
import time
import re
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
'''以上,urllib 和urllib2是用来发送request请求的模块; re模块提供各种正则表达式的匹配操作;time模块用来打印时间;
至于sys模块和其下面的代码请自行百度搜索,因为我不确定自己的理解是否正确,以免误人子弟'''
#这里定义将得到的IP地址写入文件中,filename即你自己定义的文件名,context为地址内容,ipaddress为ip内容。
def write(filename,context,ipaddress):
f=open(filename,"a")
#这行代码表示着将ip内容固定长为20的字符串,左对齐。
ip=ipaddress.strip().ljust(20)
f.write(ip+context+"\n")
f.close()
return 0
#这里定义了如何获取ip所在地的函数。
def contextget(ipadress):
url="http://www.ip.cn/index.php?ip="+ipadress
user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'
headers = {'User-Agent': user_agent}
try:
#发送request请求
request=urllib2.Request(url,headers=headers)
#得到服务器响应内容
response=urllib2.urlopen(request)
#异常
except urllib2.URLError, e:
if hasattr(e,"code"):
print e.code
if hasattr(e,"reason"):
print e.reason
#对其内容解码
content=response.read().decode('utf-8')
#核心正则表达式
pattern_1 = re.compile('<div id="result">.*?<p>.*?<code>.*?</code></p>.*?<code>(.*?)</code></p>', re.S)
items = re.findall(pattern_1, content)
for txt in items:
address=str(txt)
write("ip-out.txt",address,ipadress)
print time.ctime()
return 0
def start():
#读取存在1.txt里的ip地址
f=open("1.txt")
#读取第一行
line=f.readline()
while line:
contextget(line)
#读取下一行
line=f.readline()
f.close()
return 0
p=start()
0X00 爬虫原理
此步不算入“三步搞定”步骤。Python爬虫的原理是模拟浏览器向网站服务器发送一条request请求,然后对服务器返回的html内容进行处理,挑选出需要的内容(正则表达式的作用)。
0X01 第一步:要有明确的目标
本文以批量自动获取IP所在地内容作为目标,此处可以划分为两部分,第一是明确自己想要的信息或数据,第二是找到适合的网站。
0X02 第二步:模拟浏览器
发送request请求需要有代理的浏览器,所以Python模拟浏览器需要在发送request请求时有浏览器的信息,打开任意网页,按F12打开浏览器调试模式,点击"网络",刷新一下网页,打开任意请求,然后查看请求头,如下图。
0X03 第三步:核心--正则表达式
正则表达式的作用就是寻找(或者说匹配)到你所要的数据。网上有很多IP查询的网站,在试了几个网站后,找到了一个合适的网站,其网址为http://www.ip.cn,打开网站如下图。
随便查询几个IP地址,注意网站地址变化,每次换ip查询时,变化的是"ip="后面的内容,即ip地址,如下图。
右键页面查看网页源代码,Ctrl+F搜索广东,找到地理位置所在的代码行。
其代码行内容为:
<div id="result"><div class="well"><p>您查询的 IP:<code>113.104.142.180</code></p><p>所在地理位置:<code>广东省佛山市 电信</code></p><p>GeoIP: Guangzhou, Guangdong, China</p><p>China Telecom Guangdong</p></div></div>
此处就是书写正则表达式所的核心代码。书写正则表达式:
<div id="result">.*?<p>.*?<code>.*?</code></p>.*?<code>(.*?)</code></p>
解释:对比上面的html代码可以看到,".*?"替代了某些内容,其正是任意匹配的意思,即代表着任意内容。而带了括号的
".*?"则代表着你得到的匹配内容。
结束:代码资源 http://download.csdn.net/detail/csdncqmyg/9743617