zoukankan      html  css  js  c++  java
  • 【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
    
    '''
  • 相关阅读:
    Postman使用教程
    CAD和ArcGIS转换 矢量配准
    SAP CRM Advanced search和Simple search里Max hit表现行为的差异
    SAP CRM Product simple search的启用步骤
    如何快速定位SAP CRM订单应用(Order Application)错误消息抛出的准确位置
    如何动态修改SAP CRM WebClient UI表格栏的宽度
    如何在SAP CRM WebClient UI里创建web service并使用ABAP消费
    如何处理SAP CRM Web Service错误
    如何使用SAP CRM WebClient UI实现一个类似新浪微博的字数统计器
    如何开启SAP CRM基于WORD模板创建附件的功能
  • 原文地址:https://www.cnblogs.com/frankruby/p/10081444.html
Copyright © 2011-2022 走看看