python爬虫

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
首先通过一个例子来看看爬虫的效果
更加通俗的了解爬虫及其工作的流程

# 1. 什么是爬虫?
就是在互联网上一直爬行的蜘蛛, 如果遇到需要的资源, 那么它就会抓取下来(html内容);
模拟浏览器快速访问页面的内容.



# 2. 浏览网页的过程中发生了什么?
- 浏览器输入http://www.baidu.com/bbs/;
- 1). 根据配置的DNS获取www.baidu.com对应的主机IP;
- 2). 根据端口号知道跟服务器的那个软件进行交互。
- 3). 百度的服务器接收客户端请求:
- 4). 给客户端主机一个响应(html内容) ----- html, css, js
- 5). 浏览器根据html内容解释执行, 展示出华丽的页面;

eg:爬取贴吧图片
首先分析要爬取的网页,通过其url规律和图片的html分析结果来完成代码

url规律:
    https://tieba.baidu.com/p/5752826839?pn=1
    https://tieba.baidu.com/p/5752826839?pn=2
    https://tieba.baidu.com/p/5752826839?pn=3


图片html分析:
        <img class="BDE_Image" src="https://imgsa.baidu.com/forum/
        w%3D580/sign=8be466fee7f81a4c2632ecc1e7286029/bcbb0d338744ebf
        89d9bb0b5d5f9d72a6259a7aa.jpg" size="350738" changedsize="true"
        width="560" height="995">

        <img class="BDE_Image" src="https://imgsa.baidu.com/forum/
        w%3D580/sign=64e6bdda38a85edffa8cfe2b795609d8/4efebd315c60
        34a886086c0bc71349540b2376aa.jpg" size="286672" changedsize
        ="true" width="560" height="995">
from urllib.request import urlopen
from urllib.error import URLError
import re


def get_page(url):
    """
    获取页面内容

    :param url:
    :return:
    """
    try:
        urlObj = urlopen(url)
    except URLError as e:
        print("爬取%s失败...." % (url))
    else:
        # 默认是bytes类型, 需要的是字符串, 二进制文件不能decode
        content = urlObj.read()
        return content


def parser_content(content):
    """
    解析页面内容, 获取所有的图片链接
    :param content:
    :return:
    """
    content = content.decode('utf-8').replace('\n', ' ')
    pattern = re.compile(r'<img class="BDE_Image".*? src="(https://.*?\.jpg)".*?">')
    imgList = re.findall(pattern, content)
    return imgList


def get_page_img(page):
    url = "https://tieba.baidu.com/p/5752826839?pn=%s" %(page)
    content = get_page(url)
    print(content)

    # with open('tieba.html', 'w') as f:
    #     f.write(content)
    if content:
        imgList = parser_content(content)
        for imgUrl in imgList:
            # 依次遍历图片的每一个链接, 获取图片的内容;
            imgContent = get_page(imgUrl)
            # https://imgsa.baidu.com/forum/w%3D580/sign=a05cc58f2ca446237ecaa56aa8237246/94cd6c224f4a20a48b5d83329c529822700ed0e4.jpg
            imgName = imgUrl.split('/')[-1]
            with open('img/%s' %(imgName), 'wb') as f:
                f.write(imgContent)
                print("下载图片%s成功...." %(imgName))
if __name__ == '__main__':
    for page in range(1, 11):
        print("正在爬取第%s页的图片...." %(page))
        get_page_img(page)

在这里插入图片描述
在爬虫爬取内容的过程中,由于一些网站不支持爬取,例如下面的爬取银行信息,无法通过爬虫直接实现,则需要通过反爬虫来模拟浏览器进行爬取

常见模拟浏览器的信息:
  1.Android
    Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
    Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
    Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
    2.Firefox

    Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0
    Mozilla/5.0 (Android; Mobile; rv:14.0) Gecko/14.0 Firefox/14.0
    3.Google Chrome

    Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
    Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19
    4.iOS
    Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
import random
import re

from urllib.request import urlopen, Request
from urllib.error import  URLError
def get_content(url):
    """获取页面内容, 反爬虫之模拟浏览器"""
    # 防止一个浏览器访问频繁被封掉;
    user_agents = [
        "Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0",
        "Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19",
        "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0",
    ]
    try:
        # reqObj = Request(url, headers={'User-Agent': user_agent})
        reqObj = Request(url)
        # 动态添加爬虫请求的头部信息, 可以在实例化时指定, 也可以后续通过add—header方法添加
        reqObj.add_header('User-Agent', random.choice(user_agents))
    except URLError as e:
        print(e)
        return  None
    else:
        content = urlopen(reqObj).read().decode('utf-8').replace('\t', ' ')
        return  content


def parser_content(content):
    """解析页面内容, 获取银行名称和官网URL地址"""
    pattern = r'<a href="(.*)" target="_blank"  style="color:#08619D">\s+(.*)\s+</a>'
    bankinfos = re.findall(pattern, content)
    if not bankinfos:
        raise  Exception("没有获取符合条件的信息")
    else:
        return  bankinfos

def main():
    url = "http://www.cbrc.gov.cn/chinese/jrjg/index.html"
    content = get_content(url)
    bankinfos = parser_content(content)
    with open('doc/bankinfo.txt', 'w') as f:
        # ('http://www.cdb.com.cn/', '国家开发银行\r')
        for bank in bankinfos:
            name = bank[1].rstrip()
            url = bank[0]
            # 根据正则判断银行的url地址是否合法, 如果合法才写入文件;
            pattern =  r'^((https|http|ftp|rtsp|mms)?:\/\/)\S+'
            if re.search(pattern, url):
                f.write('%s: %s\n' %(name, url))
            else:
                print("%s无官方网站" %(name))
        print("写入完成....")


if __name__ == '__main__':
    main()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值