精华内容
下载资源
问答
  • Python3 爬虫快速入门攻略

    万次阅读 多人点赞 2017-08-15 00:39:13
    一、什么是网络爬虫? 1、定义:网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本。 2、简介:网络蜘蛛是一个很形象的名字。如果把互联网比喻成一个蜘蛛网,...

    一、什么是网络爬虫?

    1、定义:网络爬虫(Web Spider),又被称为网页蜘蛛,是一种按照一定的规则,自动地抓取网站信息的程序或者脚本。

    2、简介:网络蜘蛛是一个很形象的名字。如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从 网站某一个页面开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。

    3、爬虫流程:①先由urllib的request打开Url得到网页html文档——②浏览器打开网页源代码分析元素节点——③通过Beautiful Soup或则正则表达式提取想要的数据——④存储数据到本地磁盘或数据库(抓取,分析,存储)

    二、上代码,直接看注释

    开发环境:Win10+Python 3.6.1 64bit+PyCharm,自学Python 3爬虫时的备忘笔记。

    1爬取简书网站首页文章的标题和文章链接

    from urllib import request
    from bs4 import BeautifulSoup            #Beautiful Soup是一个可以从HTML或XML文件中提取结构化数据的Python库
    
    #构造头文件,模拟浏览器访问
    url="http://www.jianshu.com"
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
    page = request.Request(url,headers=headers)
    page_info = request.urlopen(page).read().decode('utf-8')#打开Url,获取HttpResponse返回对象并读取其ResposneBody
    
    # 将获取到的内容转换成BeautifulSoup格式,并将html.parser作为解析器
    soup = BeautifulSoup(page_info, 'html.parser')
    # 以格式化的形式打印html
    #print(soup.prettify())
    
    titles = soup.find_all('a', 'title')# 查找所有a标签中class='title'的语句
    
    '''
    # 打印查找到的每一个a标签的string和文章链接
        for title in titles:
            print(title.string)
            print("http://www.jianshu.com" + title.get('href'))   
    '''
    
    #open()是读写文件的函数,with语句会自动close()已打开文件
    with open(r"D:\Python\test\articles.txt","w") as file:       #在磁盘以只写的方式打开/创建一个名为 articles 的txt文件
        for title in titles:
            file.write(title.string+'\n')
            file.write("http://www.jianshu.com" + title.get('href')+'\n\n')
    

    结果:

    2、爬取知乎网站的美女图片链接,并保存到本地

    from urllib import request
    from  bs4 import BeautifulSoup
    import re
    import time
    
    url = "https://www.zhihu.com/question/22918070"
    html = request.urlopen(url).read().decode('utf-8')
    soup = BeautifulSoup(html,'html.parser')
    #print(soup.prettify())
    
    #用Beautiful Soup结合正则表达式来提取包含所有图片链接(img标签中,class=**,以.jpg结尾的链接)的语句
    links = soup.find_all('img', "origin_image zh-lightbox-thumb",src=re.compile(r'.jpg$'))
    print(links)
    
    # 设置保存图片的路径,否则会保存到程序当前路径
    path = r'D:\Python\test\images'                            #路径前的r是保持字符串原始值的意思,就是说不对其中的符号进行转义
    for link in links:
        print(link.attrs['src'])
        #保存链接并命名,time.time()返回当前时间戳防止命名冲突
        request.urlretrieve(link.attrs['src'],path+'\%s.jpg' % time.time())  #使用request.urlretrieve直接将所有远程链接数据下载到本地
    

    结果:

     

    三、学习总结

           大概学习了下通过urllib和Beautiful Soup 进行简单数据爬取的流程,但是那只适用于一些简单的、数据量比较小的爬虫项目,如果需要爬取的数据量比较大的话,之前的方法必定非常缓慢,而且还可能遇到大规模爬虫IP被网站封禁的情况,因为好的网站会有反爬虫策略。多线程和分布式爬虫、IP代理、处理验证码、模拟登陆、内置浏览器引擎爬虫,还有注意配合反爬虫措施比较少的移动APP端抓取(抓包工具Fiddler)等等问题。

            考虑成熟框架Scrapy,Scrapy 百度百科
        

    四、参考资料

    1、Python3 爬虫学习笔记

    2、Python3 教程|菜鸟教程

    3、PyCharm最新2017激活码

     

    展开全文
  • Python进阶(十八)-Python3爬虫小试牛刀之爬取CSDN博客个人信息  这篇文章主要介绍了如何使用Python3爬取csdn博客访问量的相关资料,在Python2已实现的基础上实现Python3爬虫,对比版本之间的差异所在,需要的朋友...

      这篇文章主要介绍了如何使用Python3爬取csdn博客访问量的相关资料,在Python2已实现的基础上实现Python3爬虫,对比版本之间的差异所在,需要的朋友可以参考下。
      使用python来获取自己博客的访问量,也是后面将要开发项目的一部分,后边会对博客的访问量进行分析,以折线图和饼图等可视化的方式展示自己博客被访问的情况,使自己能更加清楚自己的哪些博客更受关注。其实,在较早之前博客专家本身就有这个功能,不知什么原因此功能被取消了。

    一.网址分析

    这里写图片描述
      进入自己的博客页面,网址为:http://blog.csdn.net/sunhuaqiang1。 网址还是比较好分析的:就是csdn的网址+个人csdn登录账号,我们来看下一页的网址。
    这里写图片描述
      看到第二页的地址为:http://blog.csdn.net/sunhuaqiang1/article/list/2后边的数字表示现在正处于第几页,再用其他的页面验证一下,确实是这样的,那么第一页为什么不是http://blog.csdn.net/sunhuaqiang1/article/list/1呢,那么我们在浏览器中输http://blog.csdn.net/sunhuaqiang1/article/list/1试试,哎,果然是第一页啊,第一页原来是被重定向了,http://blog.csdn.net/sunhuaqiang1被重定向到http://blog.csdn.net/sunhuaqiang1/article/list/1,所以两个网址都能访问第一页,那么现在规律就非常明显了: http://blog.csdn.net/sunhuaqiang1/article/list/ + 页号

    二.获取标题

      右键查看网页的源代码,我们看到可以找到这样一段代码:
    这里写图片描述
    这里写图片描述
      我们可以看到标题都是在标签

    <span class="link_title">
    <a href="/sunhuaqiang1/article/details/50651235">
    ...
    </a>
    </span>
    

      中的。所以我们可以使用下面的正则表达式来匹配标题:

    <span class="link_title"><a href=".*?">(.*?)</a></span>
    

    三.获取访问量

      拿到了标题之后,就要获得对应的访问量了,经过对源码的分析,我看到访问量的结构都是这样的:

    <span class="link_view" title="阅读次数"><a href="/sunhuaqiang1/article/details/51289580" title="阅读次数">阅读</a>(12718)</span>
    

      括号中的数字即为访问量,我们可以用下面的正则表达式来匹配:

    <span class="link_view".*?><a href=".*?" title="阅读次数">阅读</a>\((.*?)\)</span>
    

      其中,’.?’的含义是启用正则懒惰模式。必须跟在或者+后边用。
      如:“< img src=“test.jpg” width=“60px” height=“80px”/>"
      如果用正则匹配src中内容非懒惰模式匹配

    src=".*"
    

      匹配结果是:src=“test.jpg” width=“60px” height=“80px”
      意思是从="往后匹配,直到最后一个"匹配结束
    懒惰模式正则:

    src=".*?"
    

      结果:src=“test.jpg”
      因为匹配到第一个"就结束了一次匹配。不会继续向后匹配。因为他懒惰嘛。

    • .表示除\n之外的任意字符
    • *表示匹配0-无穷
    • +表示匹配1-无穷

    四.尾页判断

      接下来我们要判断当前页是否为最后一页,否则我们就不能判断什么时候结束了,我找到了源码中‘尾页’的标签,发现是下面的结构:

    <a href="/sunhuaqiang1/article/list/2">下一页</a> <a href="/sunhuaqiang1/article/list/7">尾页</a>
    

      所以我们可以用下面的正则表达式来匹配,如果匹配成功就说明当前页不是最后一页,否则当前页就是最后一页。

    <a href=".*?">尾页</a>
    

    ##五.编程实现
      下面是摘自的Python2版完整的代码实现:

    #!usr/bin/python
    # -*- coding: utf-8 -*-
    '''
    Created on 2016年2月13日
    @author: ***
    使用python爬取csdn个人博客的访问量,主要用来练手
    '''
    import urllib2
    import re
    #当前的博客列表页号
    page_num = 1
    #不是最后列表的一页
    notLast = 1
    account = str(raw_input('输入csdn的登录账号:'))
    while notLast:
        #首页地址
        baseUrl = 'http://blog.csdn.net/'+account
        #连接页号,组成爬取的页面网址
        myUrl = baseUrl+'/article/list/'+str(page_num)
        #伪装成浏览器访问,直接访问的话csdn会拒绝
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent':user_agent}
        #构造请求
        req = urllib2.Request(myUrl,headers=headers)
        #访问页面
        myResponse = urllib2.urlopen(req)
        myPage = myResponse.read()
        #在页面中查找是否存在‘尾页'这一个标签来判断是否为最后一页
        notLast = re.findall('<a href=".*?">尾页</a>',myPage,re.S)
        print '---------------第%d页-------------' % (page_num,)
        #利用正则表达式来获取博客的标题
        title = re.findall('<span class="link_title"><a href=".*?">(.*?)</a></span>',myPage,re.S)
        titleList=[]
        for items in title:
            titleList.append(str(items).lstrip().rstrip())
        #利用正则表达式获取博客的访问量
        view = re.findall('<span class="link_view".*?><a href=".*?" title="阅读次数">阅读</a>\((.*?)\)</span>',myPage,re.S)
        viewList=[]
    for items in view:
        viewList.append(str(items).lstrip().rstrip())
    #将结果输出 
    for n in range(len(titleList)):
        print '访问量:%s 标题:%s' % (viewList[n].zfill(4),titleList[n])
    #页号加1
    page_num = page_num + 1
    

      由于自己现在的IDE为Python3,且自己在学习Python3。故在此基础上实现Python2项目的升级改造,并在改造过程中发现版本之间的差异性。以下为Python3版本下的爬虫代码。

    #!usr/bin/python
    # -*- coding: utf-8 -*-
    '''
    Created on 2017年3月19日
    @author: SUN HuaQiang
    目的:使用python爬取csdn个人博客的访问量,主要用来练手Python爬虫
    收获:1.了解Python爬虫的基本过程
          2.在Python2的基础上实现Python3,通过对比发现版本之间的差异
    '''
    import urllib.request
    import urllib
    import re
    
    #当前的博客列表页号
    page_num = 1
    #初始化最后列表的页码
    notLast = 1
    account = str(input('请输入csdn的登录账号:'))
    while notLast:
        #首页地址
        baseUrl = 'http://blog.csdn.net/' + account
        #连接页号,组成爬取的页面网址
        myUrl = baseUrl+'/article/list/' + str(page_num)
        #伪装成浏览器访问,直接访问的话csdn会拒绝
        user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
        headers = {'User-Agent':user_agent}
        #构造请求
        req = urllib.request.Request(myUrl,headers=headers)
        #访问页面
        myResponse = urllib.request.urlopen(req)
        #python3中urllib.read返回的是bytes对象,不是string,得把它转换成string对象,用bytes.decode方法
        myPage = myResponse.read().decode()
        #在页面中查找是否存在‘尾页'这一个标签来判断是否为最后一页
        notLast = re.findall('<a href=".*?">尾页</a>', myPage, re.S)
        print ('-----------第%d页--------------' % (page_num,))
        #利用正则表达式来获取博客的标题
        title = re.findall('<span class="link_title"><a href=".*?">(.*?)</a></span>',myPage,re.S)
        titleList=[]
        for items in title:
            titleList.append(str(items).lstrip().rstrip())
        #利用正则表达式获取博客的访问量
        view = re.findall('<span class="link_view".*?><a href=".*?" title="阅读次数">阅读</a>\((.*?)\)</span>',myPage,re.S)
        viewList=[]
        for items in view:
            viewList.append(str(items).lstrip().rstrip())
        #将结果输出
        for n in range(len(titleList)):
            print ('访问量:%s 标题:%s' % (viewList[n].zfill(4),titleList[n]))
        #页号加1
        page_num = page_num + 1
    

      下面是部分结果:
    这里写图片描述
      瑕疵:通过爬虫结果可以发现,在CSDN中,对于设置为指定的文章,爬取结果存在一定的问题,还包含部分css代码。
      改善:通过更改获取博文标题的正则表达式,即可解决此问题。
    这里写图片描述
    这里写图片描述
    这里写图片描述"
      想法是好的,但是直接利用正则实现标题获取时遇到了困难,暂时并未实现理想结果。
      遂改变思路,将利用正则获取后的字符串再进行二次正则,即替换操作,语句如下:

    for items in title:
        titleList.append(re.sub('<font color="red">.*?</font>', '', str(items).lstrip().rstrip()))
    

      更改后的结果如下。并同时为每篇博文进行了编号。
    这里写图片描述
      同时,自己还希望获取到的信息包括:访问总量、积分、等级、排名、粉丝、原创、转载、译文、评论等数据信息。
      以上信息在网页源码中如下所示。

    <ul id="blog_rank"> 
    	<li>访问:<span>459285次</span></li> 
    	<li>积分:<span>9214</span> </li> 
    	<li >等级: <span style="position:relative;display:inline-block;z-index:1" > 
    	<img src="http://c.csdnimg.cn/jifen/images/xunzhang/jianzhang/blog6.png" alt="" style="vertical-align: middle;" id="leveImg"> 
    	<div id="smallTittle" style=" position: absolute; left: -24px; top: 25px; text-align: center; width: 101px; height: 32px; background-color: #fff; line-height: 32px; border: 2px #DDDDDD solid; box-shadow: 0px 2px 2px rgba (0,0,0,0.1); display: none; z-index: 999;"> 
    	<div style="left: 42%; top: -8px; position: absolute; width: 0; height: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; border-bottom: 8px solid #EAEAEA;"></div> 
    	积分:9214 </div> 
    	</span> </li> 
    	<li>排名:<span>第1639名</span></li> 
    	</ul> 
    	<ul id="blog_statistics"> 
    	<li>原创:<span>425篇</span></li> 
    	<li>转载:<span>44篇</span></li> 
    	<li>译文:<span>2篇</span></li> 
    	<li>评论:<span>108条</span></li> 
    	</ul> 
    

      则获取访问信息的正则表达式为:

    #利用正则表达式获取博客信息
    sumVisit = re.findall('<li>访问:<span>(.*?)</span></li>', myPage, re.S)
    credit = re.findall('<li>积分:<span>(.*?)</span> </li>', myPage, re.S)
    rank = re.findall('<li>排名:<span>(.*?)</span></li>', myPage, re.S)
    grade = re.findall('<li >.*?<img src=.*?/blog(.*?).png.*?>.*?</li>', test3, re.S)
    original = re.findall('<li>原创:<span>(.*?)</span></li>', myPage, re.S)
    reprint = re.findall('<li>转载:<span>(.*?)</span></li>', myPage, re.S)
    trans = re.findall('<li>译文:<span>(.*?)</span></li>', myPage, re.S)
    comment = re.findall('<li>评论:<span>(.*?)</span></li>', myPage, re.S)
    

    这里写图片描述
      根据网页源码,可得出其正则表达式为

    staData = re.findall('<li><a href=.*?>(.*?)</a><span>(.*?)</span></li>', myPage, re.S)
    
    for i in staData:
        print(i[0] + ':' + i[1].lstrip('(').rstrip(')')+'篇')
    

      经过以上操作,得到的用户Blog信息如下图所示:
    这里写图片描述
      最终遇到的问题是:有关粉丝数的爬取遇到了问题,因为前面数据信息的获取不需要用户登录,而用户粉丝数是在用户已登录情景下获取的,故需要将用户登录信息添加进去。犯愁~
      PS:论文盲审送回来了,自己这段时间要用来修改论文了,后面的博客后面再说吧~

    注意事项

    • urllib2在3.5中为urllib.request;
    • raw_input()在3.5中为input();
    • python3中urllib.read()返回的是bytes对象,不是string,得把它转换成string对象,用bytes.decode()方法;
    • re.S意在使.匹配包括换行在内的所有字符;
    • python3对urllib和urllib2进行了重构,拆分成了urllib.request, urllib.response,urllib.parse,urllib.error等几个子模块,这样的架构从逻辑和结构上说更加合理。urljoin现在对应的函数是urllib.parse.urljoin

      注:Python2部分的爬虫代码为网络获取,在此向匿名人士表示感谢。

    展开全文
  • [Python3爬虫]爬取新浪微博用户信息及微博内容

    万次阅读 多人点赞 2019-06-05 20:13:26
    新浪微博作为新时代火爆的新媒体社交平台,拥有许多用户行为及商户数据,因此需要研究人员都想要得到新浪微博数据,But新浪微博数据量极大,获取的最好方法无疑就是使用Python爬虫来得到。网上有一些关于使用Python...

    [Python3爬虫]爬取新浪微博用户信息及微博内容

    大数据时代,对于研究领域来说,数据已经成为必不可少的一部分。新浪微博作为新时代火爆的新媒体社交平台,拥有许多用户行为及商户数据,因此需要研究人员都想要得到新浪微博数据,But新浪微博数据量极大,获取的最好方法无疑就是使用Python爬虫来得到。网上有一些关于使用Python爬虫来爬取新浪微博数据的教程,但是完整的介绍以及爬取用户所有数据信息比较少,因此这里分享一篇主要通过selenium包来爬取新浪微博用户数据的文章。码字不易,喜欢请点赞!!!

    在这里插入图片描述

    目标

    爬取新浪微博用户数据,包括以下字段:id,昵称,粉丝数,关注数,微博数,每一篇微博的内容,转发数,评论数,点赞数,发布时间,来源,以及是原创还是转发。(本文以GUCCI(古驰)为例)

    方法

    • 使用selenium模拟爬虫
    • 使用BeautifulSoup解析HTML

    结果展示

    步骤分解

    1.选取爬取目标网址
    首先,在准备开始爬虫之前,得想好要爬取哪个网址。新浪微博的网址分为网页端和手机端两个,大部分爬取微博数据都会选择爬取手机端,因为对比起来,手机端基本上包括了所有你要的数据,并且手机端相对于PC端是轻量级的。
    下面是GUCCI的手机端和PC端的网页展示。
    微博手机端
    微博PC端

    2.模拟登陆
    定好爬取微博手机端数据之后,接下来就该模拟登陆了。
    模拟登陆的网址
    登陆的网页下面的样子
    模拟登陆网页
    模拟登陆代码

        try:
       		print(u'登陆新浪微博手机端...')
       		##打开Firefox浏览器
        	browser = webdriver.Firefox()
        	##给定登陆的网址
            url = 'https://passport.weibo.cn/signin/login'
            browser.get(url)
            time.sleep(3)
            #找到输入用户名的地方,并将用户名里面的内容清空,然后送入你的账号
            username = browser.find_element_by_css_selector('#loginName')
            time.sleep(2)
            username.clear()
            username.send_keys('****')#输入自己的账号
            #找到输入密码的地方,然后送入你的密码
            password = browser.find_element_by_css_selector('#loginPassword')
            time.sleep(2)
            password.send_keys('ll117117')
            #点击登录
            browser.find_element_by_css_selector('#loginAction').click()
            ##这里给个15秒非常重要,因为在点击登录之后,新浪微博会有个九宫格验证码,下图有,通过程序执行的话会有点麻烦(可以参考崔庆才的Python书里面有解决方法),这里就手动
            time.sleep(15)
        except:
            print('########出现Error########')
        finally:
            print('完成登陆!')
    

    类似这样的九宫格验证

    3.获取用户微博页码
    在登录之后可以进入想要爬取的商户信息,因为每个商户的微博量不一样,因此对应的微博页码也不一样,这里首先将商户的微博页码爬下来。与此同时,将那些公用信息爬取下来,比如用户uid,用户名称,微博数量,关注人数,粉丝数目。
    这里最大页码为361

    	#本文是以GUCCI为例,GUCCI的用户id为‘GUCCI’
    	id = 'GUCCI'
        niCheng = id
        #用户的url结构为 url = 'http://weibo.cn/' + id
        url = 'http://weibo.cn/' + id
        browser.get(url)
        time.sleep(3)
        #使用BeautifulSoup解析网页的HTML
        soup = BeautifulSoup(browser.page_source, 'lxml')
        #爬取商户的uid信息
        uid = soup.find('td',attrs={'valign':'top'})
        uid = uid.a['href']
        uid = uid.split('/')[1]
        #爬取最大页码数目
        pageSize = soup.find('div', attrs={'id': 'pagelist'})
        pageSize = pageSize.find('div').getText()
        pageSize = (pageSize.split('/')[1]).split('页')[0]
        #爬取微博数量
        divMessage = soup.find('div',attrs={'class':'tip2'})
        weiBoCount = divMessage.find('span').getText()
        weiBoCount = (weiBoCount.split('[')[1]).replace(']','')
         #爬取关注数量和粉丝数量
        a = divMessage.find_all('a')[:2]
        guanZhuCount = (a[0].getText().split('[')[1]).replace(']','')
        fenSiCount = (a[1].getText().split('[')[1]).replace(']', '')
    

    4.根据爬取的最大页码,循环爬取所有数据
    在得到最大页码之后,直接通过循环来爬取每一页数据。抓取的数据包括,微博内容,转发数量,评论数量,点赞数量,发微博的时间,微博来源,以及是原创还是转发。

    #通过循环来抓取每一页数据
     for i in range(1, pageSize+1):  # pageSize+1
     		#每一页数据的url结构为 url = 'http://weibo.cn/' + id + ‘?page=’ + i
            url = 'https://weibo.cn/GUCCI?page=' + str(i)
            browser.get(url)
            time.sleep(1)
            #使用BeautifulSoup解析网页的HTML
            soup = BeautifulSoup(browser.page_source, 'lxml')
            body = soup.find('body')
            divss = body.find_all('div', attrs={'class': 'c'})[1:-2]
            for divs in divss:
                # yuanChuang : 0表示转发,1表示原创
                yuanChuang = '1'#初始值为原创,当非原创时,更改此值
                div = divs.find_all('div')
                #这里有三种情况,两种为原创,一种为转发
                if (len(div) == 2):#原创,有图
               		 #爬取微博内容
                    content = div[0].find('span', attrs={'class': 'ctt'}).getText()
                    aa = div[1].find_all('a')
                    for a in aa:
                        text = a.getText()
                        if (('赞' in text) or ('转发' in text) or ('评论' in text)):
                        	#爬取点赞数
                            if ('赞' in text):
                                dianZan = (text.split('[')[1]).replace(']', '')
                            #爬取转发数
                            elif ('转发' in text):
                                zhuanFa = (text.split('[')[1]).replace(']', '')
                             #爬取评论数目
                            elif ('评论' in text):
                                pinLun = (text.split('[')[1]).replace(']', '')    
                     #爬取微博来源和时间   
                    span = divs.find('span', attrs={'class': 'ct'}).getText()
                    faBuTime = str(span.split('来自')[0])
                    laiYuan = span.split('来自')[1]
    
    			#和上面一样
                elif (len(div) == 1):#原创,无图
                    content = div[0].find('span', attrs={'class': 'ctt'}).getText()
                    aa = div[0].find_all('a')
                    for a in aa:
                        text = a.getText()
                        if (('赞' in text) or ('转发' in text) or ('评论' in text)):
                            if ('赞' in text):
                                dianZan = (text.split('[')[1]).replace(']', '')
                            elif ('转发' in text):
                                zhuanFa = (text.split('[')[1]).replace(']', '')
                            elif ('评论' in text):
                                pinLun = (text.split('[')[1]).replace(']', '')
                    span = divs.find('span', attrs={'class': 'ct'}).getText()
                    faBuTime = str(span.split('来自')[0])
                    laiYuan = span.split('来自')[1]
    				
    			#这里为转发,其他和上面一样
                elif (len(div) == 3):#转发的微博
                    yuanChuang = '0'
                    content = div[0].find('span', attrs={'class': 'ctt'}).getText()
                    aa = div[2].find_all('a')
                    for a in aa:
                        text = a.getText()
                        if (('赞' in text) or ('转发' in text) or ('评论' in text)):
                            if ('赞' in text):
                                dianZan = (text.split('[')[1]).replace(']', '')
                            elif ('转发' in text):
                                zhuanFa = (text.split('[')[1]).replace(']', '')
                            elif ('评论' in text):
                                pinLun = (text.split('[')[1]).replace(']', '')
                    span = divs.find('span', attrs={'class': 'ct'}).getText()
                    faBuTime = str(span.split('来自')[0])
                    laiYuan = span.split('来自')[1]
            time.sleep(2)
            print(i)
    

    4.在得到所有数据之后,可以写到csv文件,或者excel
    最后的结果显示在上面展示啦!!!!
    到这里完整的微博爬虫就解决啦!!!

    展开全文
  • 原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过爬虫实现一些小工具。...

    爬虫背景

    原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过爬虫实现一些小工具。

    Python3 VIP视频下载器

    这种软件或者网站满天都是了,就是在线观看收费网站的VIP视频,你只要会玩搜索引擎或者是一个程序员基本都知道,虽说一直在被封杀,但是能赚钱的地方就一定有人钻漏洞。今天要实现的就是通过别人的API在Python中下载ts视频到本地,自己去百度一下TS视频是什么吧。
    python3图片爬虫

    找相关的接口

    我随便搜索了一下,那是非常多的,版权问题,就不放相关的地址了,当然在代码中还是会出现一下的。

    我找到这个接口应该是目前相对比较稳定的,并且还在更新的

    我看了一下,他中间主要通过三个API整体实现的页面逻辑

    首先你先去优酷啊,腾讯啊,爱奇艺啊找个VIP视频的地址,这个随意啦

    我找了一个《叶问外传》

    http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5  
    

    python3图片爬虫

    编写代码几个步骤

    在浏览器测试播放地址,得到线路播放数据

    http://y.mt2t.com/lines?url=https://v.qq.com/x/cover/5a3aweewodeclku/b0024j13g3b.html  
    

    在这里插入图片描述
    在页面的源码中,请注意,打开开发者工具直接按快捷键F12即可,右键已经被锁定。
    在源码中,发现真实的调用地址

    python3图片爬虫

    所以,你需要先匹配出来key来,非常简单,使用正则表达式即可

    import requests
    import re
    class VIP(object):
        def __init__(self):
            self.api = "http://y.mt2t.com/lines?url="
            self.url = "http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5"
    
        def run(self):
            res = requests.get(self.api+self.url)
            html = res.text
    
            key = re.search(r'key:"(.*?)"',html).group(1)
            print(key)
    
    if __name__ == '__main__':
        vip = VIP()
        vip.run()
    

    得到key之后,就可以进行获取播放地址了,经过分析也可以知道接口为

    Request URL: http://y.mt2t.com/lines/getdata
    Request Method: POST
    

    那么只需要编写一下即可

    import requests
    import re
    import json
    
    class VIP(object):
        def __init__(self):
            self.api = "http://y.mt2t.com/lines?url="
            self.post_url = "http://y.mt2t.com/lines/getdata"
            self.url = "http://v.youku.com/v_show/id_XNDA0MDg2NzU0OA==.html?spm=a2h03.8164468.2069780.5"
    
        def run(self):
            res = requests.get(self.api+self.url)
            html = res.text
    
            key = re.search(r'key:"(.*?)"',html).group(1)
            return key
    
        def get_playlist(self):
    
            key = self.run()
    
            data = {
                "url":self.url,
                "key":key
            }
            html = requests.post(self.post_url,data=data).text
            dic = json.loads(html)
            print(dic)
    
    if __name__ == '__main__':
        vip = VIP()
        vip.get_playlist()
    

    上面的代码可以得到如下的数据集

    python3图片爬虫
    这个数据集需要解析一下,用来获取播放地址,请注意还有一个接口我们需要打通

    Request URL: http://y2.mt2t.com:91/ifr/api
    Request Method: POST
    

    参数如下

    url: +bvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk+SpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6+LAY=
    type: m3u8
    from: mt2t.com
    device: 
    up: 0
    

    这个API的所有参数都是从刚才获得的数据集分解出来的
    提取上面结果集中的URL

    http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8
    

    对这个URL进行分解,这个地方你需要了解一般情况下URL进行哪些符号的特殊编码

    大小写都有可能

    符号 特殊编码
    + %2d
    / %2f
    % %25
    = %3d
    ? %3F
    # %23
    & %26

    所以编写的代码如下

        def url_spilt(self):
            url = "http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8"
            url = url.split("?url=")[1].split("&")[0].replace("%2b","+").replace("%3d","=").replace("%2f","/")
            print(url)
    

    接下来获取type 这个比较容易
    只需要判断以下type=是否在字符串中然后截取即可。

    url截取的代码如下

        def url_spilt(self,url):
            #url = "http://y2.mt2t.com:91/ifr?url=%2bbvqT10xBsjrQlCXafOom96K2rGhgnQ1CJuc5clt8KDHnjH75Q6BhQ4Vnv7gUk%2bSpJYws4A93QjxcuTflk7RojJt0PiXpBkTAdXtRa6%2bLAY%3d&type=m3u8"
            url_param = url.split("?url=")[1].split("&")[0].replace("%2b","+").replace("%3d","=").replace("%2f","/")
            if "type=" in url:
                type = url.split("type=")[1]
            else:
                type = ""
            return url_param,type
    

    完善get_playlist函数,最终的代码如下

        def get_playlist(self):
    
            key = self.run()
    
            data = {
                "url":self.url,
                "key":key
            }
            html = requests.post(self.post_url,data=data).text
            dic = json.loads(html)
    
            for item in dic:
                url_param, type = self.url_spilt(item["Url"])
                res = requests.post(self.get_videourl,data={
                    "url":url_param,
                    "type":type,
                    "from": "mt2t.com",
                    "device":"",
                    "up":"0"
                })
                play = json.loads(res.text)
                print(play)
    

    运行之后得到下面的提示,其中最重要的m3u8已经成果获取到,完成任务
    python3图片爬虫
    python3图片爬虫

    展开全文
  • python3爬虫系列09之爬虫数据存入MySQL数据库

    千次阅读 多人点赞 2019-11-19 01:11:47
    python3爬虫系列09之爬虫数据存入MySQL数据库 1. 前言 在上一篇当中呢,python3爬虫系列08之新版动态智联爬虫,我们已经把智联招聘的某地区,某岗位,某页数的所有数据爬下来了,然后保存为了一个text文件。 这一篇...
  • python3 爬虫 urlretrieve

    千次阅读 2016-08-20 19:55:09
    网上的Python3 爬虫教程很少,自己就写了个小例子。import re import urllib.request ###result yes # version 3.5 def Schedule(a,b,c): ''' a:已经下载的数据块 b:数据库块的大小 c:远程文件的大小 ''' per ...
  • python3爬虫技术路线

    千次阅读 2018-09-16 23:07:37
    python3爬虫技术路线: python3——requests库 python3——beautifulSoup库 python3——re库 python3——WordCloud库(博主在爬取网易云音乐是制作了词云) python3——jieba库(中文分析) python3——...
  • 通过Python3 爬虫抓取漫画图片

    千次阅读 2018-12-27 16:08:41
    通过Python3 爬虫抓取漫画图片 引言: 最近闲来无事所以想着学习下python3,看了好长时间的文档,于是用python3写了一个漫画抓取的程序,好了 废话不多说上码! 第一步: 准备环境 和类库,我用的是python3.5 禁用 ...
  • python3 爬虫抓取股市数据

    千次阅读 2019-02-28 08:54:13
    python3 爬虫抓取股市数据代码 代码 import requests import random import re # 创建 User-Agent 池 UA_list = [{&amp;quot;User-Agent&amp;quot;:&amp;quot;Mozilla/5.0 (Windows NT 6.1; Win64; x64...
  • python3爬虫系列18之随机User-Agent 和ip代理池的使用 我们前面几篇讲了爬虫增速多进程,进程池的用法之类的,爬虫速度加快呢,也会带来一些坏事。 1. 前言 比如随着我们爬虫的速度越来越快,很多时候,有人发现,...
  • python3爬虫系列13之find_all爬虫高考分数线并绘制分析图(普通版) 1. 前言 之前一篇是 python3爬虫系列10之使用pymysql+pyecharts读取Mysql数据可视化分析,里面采用了pyecharts来进行数据绘图。 在上一篇文章中,...
  • Python3静态网页爬虫新手实践及代码、经验分享 写在最前 在写爬虫之前需要先配置python环境,爬取静态网页的文字及图片只需要通过pip安装Scrapy、beautifulsoup4 。(此处略去一万字,可以自行百度python3爬虫框架...
  • 近期学了几天的python爬虫,在一个人瞎摸索中吸取了很多经验,在此把自己的初学者学习的经验拿出来分享。 下面讲的是python3,没了解过python2,不过似乎有些地方两者区别很大。 入门python3爬虫需要对一些库...
  • python3爬虫系列20之反爬需要登录的网站处理 1.前言 在上一篇文章中,讲了python3爬虫系列19之反爬随机 User-Agent 和 ip代理池的使用,实际上这是属于反爬中的一个了,在数据采集的过程中,基本上经常遇到这些情况...
  • 一、最简单的爬虫python3 爬虫小白系列文章)

    万次阅读 多人点赞 2018-06-23 22:56:53
    看了崔老师的python3网络爬虫实战,受益匪浅,为了帮助自己更好的理解这些知识点,于是打算趁着这股热乎劲,针对爬虫实战进行一系列的教程。 阅读文章前,我会默认你已经具备一下几个要素 1.python3安装完毕 ...
  • python3爬虫系列08之新版动态智联爬虫和存取数据库进行可视化分析 本篇是面向新版动态智联爬虫,数据存储到Mysql数据库,最后使用pyecharts读取并可视化分析。 在这之前,上一篇说的是 python3爬虫系列07之动态网页...
  • selenium模拟登录获取cookie提取数据Python3 爬虫selenium模拟登录获取数据 Python3 爬虫 因为工作需要selenium爬取数据,所以写一下自己的整个流程以及过程中踩过的坑,希望能帮到大家! selenium模拟登录获取数据 ...
  • 求问:关于Python3爬虫 将一个爬虫小程序打包成.exe发给同学后运行秒退 求问:关于Python3爬虫 将一个爬虫小程序打包成.exe发给同学后运行秒退 初学爬虫也是第一次用这个博客。希望各位大佬不吝赐教 ...
  • python3爬虫系列16之爬虫增速多进程,进程池的用法(白话解释) 1.前言 上一篇文章呢, python3爬虫系列15之多线程爬取汽车之家批量下载图片,我们采用了多线程的方式来爬取, 在耗时环节呢,感觉并不是很快,才600多...
  • Python3爬虫 抓取网页的html 保存

    千次阅读 2019-02-24 01:22:46
    1. Python3爬虫 保存抓取网页的html REF: https://blog.csdn.net/u014453898/article/details/73459938 2017年06月19日 12:15:05 ZJE_ANDY 阅读数:1602  版权声明:本文为博主原创文章,未经博主允许不得...
  • python3爬虫(基于requests、BeautifulSoup4)之环境配置 1.环境基础介绍: 操作系统:windows10 ...2.python爬虫依赖库下载: 打开cmd,输入pip install requests,完成后执行pip install BeautifulSoup4 ...
  • python3爬虫爬取网页图片简单示例

    万次阅读 2017-10-19 21:44:00
    于是我也就写一个python3简单的爬虫爬虫一下贴吧的图片吧。话不多说,我们开始。 首先简单来说说一下知识。 一、什么是爬虫? 网页上面采集数据 二、学习爬虫有什么作用? 做案例分析,做数据分析,分析网页...
  • 利用python3爬虫下载图片、pdf文档

    千次阅读 2018-11-19 22:40:25
    环境 语言环境:python3.6 ...我们知道python3爬虫是利用爬虫模拟浏览器向服务端发送请求,并解析服务器返回来的响应,像上述这些文件都是以二进制形式返回到本地客户端的。而response对象的属性content表示的...
  • python3爬虫入门

    千次阅读 2017-09-09 10:12:40
    你需要这些:Python3.x爬虫学习资料整理 路人甲 9 个月前 之前整理过很多的有关于Python的学习资料,都是有关于Python2.x的资料。我们都知道Python3.x已经存在很长一段时间了:3.x改进了的标准库模块、安全性...
  • python3爬虫手把手教 python官方手册
  • python3爬虫编码问题

    千次阅读 2018-04-01 11:59:21
    使用爬虫爬取网页经常遇到各种编码问题,因此产生乱码 今天折腾了一天,全部总结一遍 环境:win10,pycharm,python3.4 1.首先先来网页编码是utf-8的: 以百度首页为例: 使用requests库 import requests url=...
  • python3爬虫requests.get(url)出现http 500错误一直想要收集各种一些漏洞的详细描述,但是如果直接去国家信息安全漏洞库,查找,复制,太机械了,宝宝不想这么做,漏洞编号我已经找好了,怎样才能更快的收集它们对应...
  • python3爬虫之访问量、点击率数据的爬取分析 1.明确问题: 通过开发者工具分析我们可以看出,这个点击率并不是‘静态数据’,而是一个脚本返回,那么这个数据到底藏在哪里呢? 经验告诉我,不是Doc 就在Js找...
  • python3 爬虫 零基础快速上手(爬虫示例)

    万次阅读 多人点赞 2017-12-22 09:55:26
    (补1:由于csdn页面重构了,看到有很多人浏览,特地更新一下获取内容补充的字都为绿字) Python是一种面向对象的解释型计算机程序设计...Python是一种高级的语言。 一:python 安装:首先,根据你的Windows版本(...
  • python3爬虫之后的数据保存问题(基于Pandas库) 1.老生常谈,环境配置: pip install pandas 又因为pandas库中依赖openpyxl所以 pip install openpyxl 2.爬虫过程简介: 这一次我爬取的是太原理工大学主页...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 295,386
精华内容 118,154
关键字:

python3爬虫

python 订阅
爬虫 订阅