Python爬虫,教你三步搞定

      前言:本文于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值