• 【Python55--爬虫:代理】


    一、反爬虫之隐藏

    1、网站检查访问的是正常用户还是程序,关键在于User-Agent

    1)、第一种方法:采用header

      --修改header(两种方法):

      -->  在Request之前通过headers参数修改

      -->  在Request之后通过Request.add_header()修改

    import urllib.request
    import urllib.parse
    import json
    import random
    import time
    import hashlib
    
    #用户输入翻译的内容
    content = input('请输入需要翻译的内容:')
    #连接url地址
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    
    #第一种方法:
    #head = {}
    #head['User-Agent']='Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'
    
    #发送给服务器请求的数据
    data = {}
    #此部分数据来源于:FromData
    data['i']= content
    data['from']= 'AUTO'
    data['to']= 'AUTO'
    data['smartresult']= 'dict'
    data['client']= 'fanyideskweb'
    data['salt']= '15439012305959'
    data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b'
    data['ts']= '1543901230595'
    data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5'
    data['doctype']= 'json'
    data['version']= '2.1'
    data['keyfrom']= 'fanyi.web'
    data['action']= 'FY_BY_CLICKBUTTION'
    data['typoResult']= 'false'
    
    #对数据进行编码处理
    data = urllib.parse.urlencode(data).encode('utf-8')
    #创建一个request对象,把url和data传进去,并且使用POS请求
    request = urllib.request.Request(url = url,data=data,method='POST')
    
    #第二种方法:
    request.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36')
    
    #打开请求
    reponsend =urllib.request.urlopen(request)
    #读取返回来的数据
    html = reponsend.read().decode('utf-8')
    #把返回来的json字符串解析成字典
    line = json.loads(html)
    #print(line)
    #获取翻译结果
    print('翻译的结果:%s'%(line['translateResult'][0][0]['tgt']))

    2)、要想爬取很多内容,修改header就达不到这种效果了,就需要采用代理

      --  两种方法:

       -->  time.sleep() 方法  (效率低)

       -->  使用代理

    #time.sleep()方法
    import
    urllib.request import urllib.parse import json import random import time import hashlib while True: #用户输入翻译的内容 content = input('请输入需要翻译的内容(输入q!退出程序):') if content=='q!': break #连接url地址 url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule' #发送给服务器请求的数据 data = {} #此部分数据来源于:FromData data['i']= content data['from']= 'AUTO' data['to']= 'AUTO' data['smartresult']= 'dict' data['client']= 'fanyideskweb' data['salt']= '15439012305959' data['sign']= 'ba81b8cb1c6dc64c253bf6d250cbc09b' data['ts']= '1543901230595' data['bv']= '6d37ec4625573a83fa9ca0cb1e144ce5' data['doctype']= 'json' data['version']= '2.1' data['keyfrom']= 'fanyi.web' data['action']= 'FY_BY_CLICKBUTTION' data['typoResult']= 'false' #对数据进行编码处理 data = urllib.parse.urlencode(data).encode('utf-8') #创建一个request对象,把url和data传进去,并且使用POS请求 request = urllib.request.Request(url = url,data=data,method='POST') #打开请求 reponsend =urllib.request.urlopen(request) #读取返回来的数据 html = reponsend.read().decode('utf-8') #把返回来的json字符串解析成字典 line = json.loads(html) #print(line) #获取翻译结果 print('翻译的结果:%s'%(line['translateResult'][0][0]['tgt'])) time.sleep(3) 执行结果: 请输入需要翻译的内容(输入q!退出程序):爱国 翻译的结果:patriotic 请输入需要翻译的内容(输入q!退出程序):乘法 翻译的结果:The multiplication 请输入需要翻译的内容(输入q!退出程序):q! >>>

     -->代理步骤:

    1、参数是一个字典{'类型':'代理IP:端口号'}

    proxy_support = urllib.request.ProxyHandler({})

    2、定制、创建一个opener

    opener = urllib.request.build_opener(proxy_support)

    3a、安装opener

    urllib.request.install_opener(opener)

    3b、调用opener

    opener.open(url)

    import urllib.request
    import random
    
    #此网址显示当前IP的所在地址
    url = 'http://www.whatismyip.com.tw'
    
    iplist=['123.139.56.238:9999','163.125.158.250:8888','113.200.214.164:9999','111.11.98.58:9000','221.178.176.25:3128']
    
    proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
    
    opener = urllib.request.build_opener(proxy_support)
    opener.addheaders=[('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36')]
    
    urllib.request.install_opener(opener)
    
    response=urllib.request.urlopen(url)
    
    html = response.read().decode('utf-8')
    
    print(html)

    二、动手题

    1、编写一个爬虫,爬百度百科“网络爬虫”的词条,(连接: http://baike.baidu.com/view/284853.htm),将所有包含“view”的连接按下边格式打印出来:

    '''
    |-- 代码解析思路:
    |-- 1、通过bs4的BeautifulSoup来获取html的源代码
    |-- 2、从源代码中找到包含"view"的href链接
    |-- 3、把获取出来的连接打印出来
    '''
    
    import urllib.request
    import re
    from bs4 import BeautifulSoup
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    def main():
        url = 'http://baike.baidu.com/view/284853.htm'
        response = urllib.request.urlopen(url)
        html = response.read()
    
        #采用BeautifulSoup来获取html源代码
        soup = BeautifulSoup(html,'html.parser') #使用python默认的解析器
    
        #源代码中找到包含view的href地址
        #正则表达式(re.compile之后的对象)
        for each in soup.find_all(href = re.compile("view")):
            print("=======
    ",each)
            #join():拼接字符串,元组,列表中的元素
            #os.path.join():将多个路径组合后返回
            context = ''.join([each.text])
            url2 = ''.join(["http://baike.baidu.com",each["href"]])
            print(context,"-->",url2)
    
            # print(each.text,"-->",''.join(["http://baike.baidu.com",each["href"]]))
    
    if __name__ == "__main__":
        main()
    '''
    =======
     <a href="/wikicategory/view?categoryName=恐龙大全" target="_blank">恐龙百科</a>
    恐龙百科 --> http://baike.baidu.com/wikicategory/view?categoryName=恐龙大全
    =======
     <a href="/wikicategory/view?categoryName=多肉植物" target="_blank">多肉百科</a>
    多肉百科 --> http://baike.baidu.com/wikicategory/view?categoryName=多肉植物
    =======
     <a class="lock-lemma" href="/view/10812319.htm" nslog-type="10003105" target="_blank" title="锁定"><em class="cmn-icon wiki-lemma-icons wiki-lemma-icons_lock-lemma"></em>锁定</a>
    锁定 --> http://baike.baidu.com/view/10812319.htm
    
    '''

    知识扩展:

    https://www.cnblogs.com/franknihao/p/6542460.html

    https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/index.html

    2、直接打印词条名和连接不算什么本事,这题要求你的爬虫允许用户输入关键词,然后爬虫进入每一个词条,然后检索该词条是否具有副标题,如果有,请将副标题一块打印出来

    # encoding:utf-8
    import urllib.request
    import urllib.parse
    import re
    from bs4 import BeautifulSoup
    import ssl
    ssl._create_default_https_context = ssl._create_unverified_context
    
    def main():
        keyword = input("请输入检索的词:")
        #把keyword转换成python识别的字符串
        #https://baike.baidu.com/search/word?word=%E8%83%A1%E6%AD%8C
        keyword = urllib.parse.urlencode({"word":keyword})
    
        #打开网页
        response = urllib.request.urlopen("https://baike.baidu.com/search/word?%s" %keyword)
    
        #获取网页输出
        html = response.read()
    
        #使用BeautifulSoup读取网页源代码
        soup = BeautifulSoup(html,"html.parser")
    
        #中文字符用于判断是否是中文
        zh_pattern = re.compile(u'[u4e00-u9fa5]+')
    
        #开始第二遍的遍历
        for each in soup.find_all(href = re.compile("view")):
            #find_all 代表全文搜索,find 只显示一条结果
            #href = re.compile("view") 如下例子:
            #<a target=_blank href=/view/5458338.htm>一念执着</a>
            #re.compile("view") 正则匹配有view关键字的链接
            #print("each--",each)
    
            #获取链接的标题
            #<a href="/wikicategory/view?categoryName=多肉植物" target="_blank">多肉百科<>
            #context = 多肉百科
            context = ''.join([each.text])
    
            #如果标题为空,则终止本次循环
            if context == "":
                continue
    
            #拼接新的URL链接
            #(http://baike.baidu.com)+ (/wikicategory/view?categoryName=多肉植物)
            url2 =''.join(["http://baike.baidu.com",each["href"]])
    
            #出现一个问题,如果链接是完整的,然后在加上前缀就不对了
            #http: // baike.baidu.comhttp: // baike.baidu.com / view / 12878522.htm
    
            #如果url2中出现中文,就终止本次循环,因为编码不一样就会报错然后结束程序
            if zh_pattern.search(url2):
                continue
    
            # 打开网址如下:
            # http://baike.baidu.com/view/482616.htm
            # 然后获取网页内容
            response2 = urllib.request.urlopen(url2)
            html2 = response2.read()
            soup2 = BeautifulSoup(html2,"html.parser")
    
            #如果网页h2标签存在(即:副标题存在),则重新定义context
            if soup2.h2:
                context = ''.join([context,soup2.h2.text])
            context = ''.join([context,"-->",url2])
            #打印完整的内容:标题+副标题 --> url链接
            print(context)
    
    if __name__ == "__main__":
        main()
    '''
    /usr/local/bin/python3.7 /Users/wufq/WebCrawler/wc/百度百科搜索.py
    请输入检索的词:胡歌
    岑参诗作(岑参诗作)-->http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/18074325#viewPageContent
    2011年孙凰发行二胡民乐(2011年孙凰发行二胡民乐)-->http://baike.baidu.com/item/%E8%83%A1%E6%AD%8C/22240446#viewPageContent
    锁定目录-->http://baike.baidu.com/view/10812319.htm
    一念执着-->http://baike.baidu.com/view/5458338.htm
    逍遥叹(胡歌演唱歌曲)-->http://baike.baidu.com/view/345628.htm
    一吻天荒目录-->http://baike.baidu.com/view/8130305.htm
    忘记时间-->http://baike.baidu.com/view/2492625.htm
    六月的雨目录-->http://baike.baidu.com/view/34074.htm
    光棍(单身人士称谓)-->http://baike.baidu.com/view/88402.htm
    天亮以后-->http://baike.baidu.com/view/482616.htm
    月光(胡彦斌演唱《秦时明月》系列片头曲)-->http://baike.baidu.com/view/18752.htm
    乌云然目录-->http://baike.baidu.com/view/1639821.htm
    敢不敢爱(胡歌演唱歌曲)-->http://baike.baidu.com/view/2894946.htm
    高手(2005年潘玮柏音乐专辑)-->http://baike.baidu.com/view/91601.htm
    我不做英雄目录-->http://baike.baidu.com/view/5930821.htm
    
    Process finished with exit code 0
    
    '''
  • 相关阅读:
    django 重建一个表
    近期数据工作的知识点总结(model-dict高级用法)
    搬运django中文网 CentOS7下部署Django项目详细操作步骤(django安装网站有时候打不开,备份用)
    创建ftp免密只读用户(外系统读取csv共享数据)
    某某系统从外部基础库读取数据
    离线安装 django-axes
    django queryset用法总结二
    django queryset用法总结一
    nginx 启动,停止 重启
    安装安全狗失败 ,linux wget的时候不去找目标ip,而是路由到其他ip,原因分析
  • 原文地址:https://www.cnblogs.com/frankruby/p/10081444.html
Copyright © 2020-2023  润新知