Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 585|回复: 0

python 抓取搜狗微信出现的问题,求大神解决

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-8-28 11:59:08 | 显示全部楼层 |阅读模式

    爬取到的data不是想要获取文章页面的源码,而是跳转到验证码的页面的源码。我网上查了一下是由于访问过于频繁导致的,我也加了time.sleep和改了请求头但还是显示不了,求大神支招,除了识别验证码的方式还能怎么做??

    import re
    import urllib.request
    import time
    import urllib.error
    
    headers = {'User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
    opener = urllib.request.build_opener()
    opener.addheaders = [headers]
    #设置一个列表listurl储存文章网址列表
    listurl = []
    #函数:使用代理IP
    def use_proxy(proxy_addr,url):
        try:
            import urllib.request
            proxy = urllib.request.ProxyHandler({'http':proxy_addr})
            opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
            urllib.request.install_opener(opener)
            data = urllib.request.urlopen(url).read().decode('utf-8')
            return data
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"e.reason"):
                print(e.reason)
            time.sleep(10)
        except Exception as e:
            print("expection:"+str(e))
            time.sleep(1)
    
    #函数:获取所有文章的连接
    def getlisturl(key,pagestart,pageend,proxy):
        try:
            #page = pagestart
            #编码关键词
            keycode = urllib.request.quote(key)
            #编码"&page"
            #pagecode = urllib.request.quote("&page")
            #循环爬取各页的文章链接
            for page in range(pagestart,pageend+1,1):
                #每次循环构建各页的url
                url = 'http://weixin.sogou.com/weixin?&type=2&ie=utf8&query='+keycode+"&&page="+str(page)
                #用换IP函数获得data
                data1 = use_proxy(proxy,url)
                time.sleep(1)
                #匹配的正则表达式
                pattern1 = '<div class="txt-box">.*?(http://.*?)"'
                listurl.append(re.compile(pattern1,re.S).findall(data1))
            print("共获取到"+str(len(listurl))+"")#便于调试
            return listurl
        except urllib.error.URLError as e:
            if hasattr(e,"code"):
                print(e.code)
            if hasattr(e,"reason"):
                print(e.reason)
            #若为URLerror异常,延迟10s进行
            time.sleep(10)
        except Exception as e:
            print("exception:"+str(e))
            #若为Exception异常,延迟1s进行
            time.sleep(1)
    
    #函数:通过链接获取对应的内容
    def getcontent(listurl,proxy):
        i = 0
        #设置本地文件中的开始html编码
        html1 = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtm11/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>微信文章页面</title>
    </head>
    <body>'''
        with open("D:/WEB/1.html","wb")as f:
            f.write(html1.encode("utf-8"))
        #再次以追加写入的方式打开文件,以写入对应文章内容
        with open("D:/WEB/1.html","ab")as ff:
            #此时listurl为二维列表,形如listurl[][],第一维存储信息跟第几页相关,第二维存的跟该页第几个文章链接相关
            for i in range(0,len(listurl)):
                for j in range(0,len(listurl)):
                    try:
                        url = listurl[j]
                        #处理真实url,亦可观察对应网址的关系自行分析,采集网址比真实网址多了一串amp
                        url = url.replace("amp;","")
                        #使用代理去爬取对应网址的内容
                        data = use_proxy(proxy,url)
                        #文章标题正则表达式
                        titlepat = "<title>(.*?)</title>"
                        #文章内容正则表达式
                        contentpat = 'id="js_content">(.*?)id="js_sg_bar"'
                        #找到标题并赋给列表title
                        title = re.compile(titlepat).findall(data)
                        #找到内容并赋给列表content
                        content = re.compile(contentpat,re.S).findall(data)
                        #初始化标题与内容
                        thistitle = "此次没有获取到"
                        thiscontent= "此次没有获取到"
                        #如果标题列表不为空,说明找到了标题,取列表第0个元素,即此次标题赋给变量thistitle
                        if (title!=[]):
                            thistitle = title[0]
                        if (content!=[]):
                            thiscontent = content[0]
                        #将标题与内容汇总赋给变量dataall
                        dataall = '<p>标题为:'+thistitle+'</p><p>内容为:'+thiscontent+'</p><br>'
                        #将文章标题与内容写入对应文件
                        ff.write(dataall.encode("utf-8"))
                        print(""+str(i)+"个网页第"+str(j)+"次处理")#便于调试
                    except urllib.error.URLError as e:
                        if hasattr(e,"code"):
                            print(e.code)
                        if hasattr(e,"reason"):
                            print(e.reason)
                        time.sleep(10)
                    except Exception as e:
                        print("exception:"+str(e))
                        time.sleep(1)
        html2 = '''</body>
    </html>
        '''
        with open("D:/WEB/1.html","ab")as f:
            f.write(html2.encode("utf-8"))
    
    #设置关键词
    key = "物联网"
    #设置代理服务器
    proxy = "122.72.32.73:80"
    #可以为getlisturl()与getcontent设置不同的代理服务器,此处没有启用该项设置
    proxy2 = ""
    #启示页
    pagesatrt = 1
    #爬取到哪页
    pageend = 2
    listurl = getlisturl(key,pagesatrt,pageend,proxy)
    getcontent(listurl,proxy)

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-29 07:44 , Processed in 0.072744 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表