zoukankan      html  css  js  c++  java
  • Scrapy项目



          

            要求编写的程序可获取任一贴吧页面中的帖子链接,并爬取贴子中用户发表的图片,在此过程中使用user agent 伪装和轮换,解决爬虫ip被目标网站封禁的问题。熟悉掌握基本的网页和url分析,同时能灵活使用Xmind工具对Python爬虫程序(网络爬虫)流程图进行分析。



    一、项目分析

       1. 网页分析

             贴吧页面简洁,所有内容让人一目了然,使用起来也较其他社区论坛简单,注册简单甚至可以不注册,发   帖简单。但栏目创建得参差不齐,内容千奇百怪。

    2. url分析

    分析贴吧中,贴子链接的拼接构成形态,在程序中将贴子链接重构。

        如本例实验,经过多次进入不同贴吧可知,贴吧的链接组成为:fullurl=url+key。其中fullurl表示贴吧总链接

          url为贴吧链接的共同体:https://tieba.baidu.com/f?

           key为经过urlencode编码的贴吧中文名

          使用xpath_helper_2_0_2.crx浏览器插件,可将贴子的链接入口归结为:

          “//li/div[@class="t_con cleafix"]/div/div/div/a/@href”,贴子中用户发表的图片链接表达式为:“//img    ··[@class="BDE_Image"]/@src”


    二、项目工具

          Python 3.7.1         、   JetBrains PyCharm 2018.3.2


    三、项目过程

    (一)使用Xmind工具对Python爬虫程序(网络爬虫)流程图进行分析,绘制如图4-1所示的程序逻辑框架图

    clip_image002

    图4-1  程序逻辑框架图 


    (二)爬虫程序调试过程BUG描述(截图)

    clip_image002[10]


    (三)爬虫运行结果

    clip_image002[12]


    clip_image002[14]

    clip_image002[16]


    (四)项目心得

    关于本例实验心得可总结如下:

    1、 当程序运行结果提示错误为:ModuleNotFoundError: No module named 'lxml',最好的解决方法是:首先排除是否lxml是否安装,再检查lxml是否被导入。本实验中,是由于工程项目为能成功导入lxml,解决方法如图5-1所示,在“Project Interperter”中选择python安装目录,即可。

    clip_image002[19]

    图5-1 错误解决过程


    2、 有的时候要模拟浏览器 ,不然做过反爬虫的网站会知道你是robot

          例如针对浏览器的限制我们可以设置User-Agent头部,针对防盗链限制,我们可以设置Referer头部 有的网站用了Cookie来限制,主要是涉及到登录和限流,这时候没有什么通用的方法,只能看能否做自动登录或者分析Cookie的问题了。


    3、 我们第一步可以在主界面的html代码中抽取出这些套图起始的链接地址,这里显然需要用到正则来提取这些不同地址。那么,有了每个套图的起始地址之后,我们进入到子页面,刷新网页,观察它的加载流程。



    四、项目源码

       tieba-pic.py

    from urllib import  request,parse
    import ssl
    import random
    import time
    from lxml import  etree
    ua_list=[
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
        'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:45.0) Gecko/20100101 Firefox/45.0'
    ]
    def loadPage(url):
        userAgent=random.choice(ua_list)
        headers={"User-Agent":userAgent}
        req =request.Request(url,headers=headers)
        context=ssl._create_unverified_context()
        response=request.urlopen(req,context=context)
        html=response.read()
        content=etree.HTML(html)
        link_list=content.xpath('//li/div[@class="t_con cleafix"]/div/div/div/a/@href')
    
        for link in link_list:
            fullurl='http://tieba.baidu.com'+link
            print(fullurl)
            loadImge(fullurl)
    
    
    
    def loadImge(url):
        req = request.Request(url)
        context = ssl._create_unverified_context()
        response = request.urlopen(req, context=context)
        html = response.read()
        content = etree.HTML(html)
        link_list = content.xpath('//img[@class="BDE_Image"]/@src')
        for link in link_list:
            print(link)
            writeImge(link)
    
    def writeImge(url):
        req = request.Request(url)
        context = ssl._create_unverified_context()
        response = request.urlopen(req, context=context)
        image = response.read()
        filename=url[-12:]
        f=open(filename,'wb')
        f.write(image)
        f.close()
    
    
    def tiebaSpider(url,beginPage,endPage):
        for page in range(beginPage,endPage+100):
            pn=(page-1)*50
            fullurl=url+"&pn="+str(pn)
            loadPage(fullurl)
    
    if __name__=="__main__":
        print("测试成功!")
        kw=input("请输入要爬的贴吧名:")
        beginPage=int(input("请输入开始页:"))
        endPage = int(input("请输入结束页:"))
        url="http://tieba.baidu.com/f?"
        key=parse.urlencode({"kw":kw})
        fullurl=url+key
        tiebaSpider(fullurl,beginPage,endPage)
  • 相关阅读:
    【php-04控制流程】
    【php-03函数】
    【php-02-变量】
    【php-01-标记符】
    【CSS 基础面试题】
    【CSS3特效之转化(transform)和过渡(transition)】
    【jsonp】
    【PHP 面试知识梳理】
    OM模块功能&API详解
    EBS 多SHEET页EXCEL动态报表开发过程
  • 原文地址:https://www.cnblogs.com/Raodi/p/11187136.html
Copyright © 2011-2022 走看看