zoukankan      html  css  js  c++  java
  • 爬虫(4)_代码分析

    [后续会整理 出PPT,将放置源码素材内以供下载~]

    [任何爬虫均只为学习,不用于商业及其他目的,侵权删]

    [如果你有其他测试领域的想法,也可以私信我发稿给我在公众号上展示哦]


    一.演示


    首先,我们先观看下效果,这个效果为后端执行爬取的动作;暂时不涉及入库及前端展示。[虚机centos网络不好,我切换到了window演示]

    [请关注公众号观看]

    我将爬取的内容存入了html文件,并保留了html文件的样式,样式地址来源于官网样式,没有继续爬取官网的样式

    二.安装


    在前两节中,我们安装了python+django。基于第三节网站分析,我们需要再安装两个库:

    pip install requestspip install PyQuery

    requests: 请求网页的时候需要使用到;

    PyQuery: 对网页解析的时候需要使用到,这个语法类似jQuery。

    三.代码编写分析


    1)首页的解析代码分析

    $(".PagedList-skipToPage")

    我们在首页分析的时候,有展示使用这个代码在console敲出的效果,可以返回去观看下上节《爬虫(3)_对网站的分析

    以上的这个代码,实际上是获取所有的页面数值,统计总共有多少页请求,即免费书籍的总数额,这项的作用在于发送请求的参数kw的值,参考如下:

    def FreeComputerBook():
        url="http://www.ituring.com.cn/book"
        kw="tab=free&sort=vote"
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
        response=requests.get(url,params=kw,headers=headers)
        htmlResult=pq(response.text)
        
        pageCount=htmlResult(".PagedList-skipToPage").items()
        pageNum=0
        bookCount=0
        books=[]
        for page in pageCount:
            kw="tab=free&sort=vote&page="+str(pageNum)
            pageNum=pageNum+1
            response=requests.get(url,params=kw,headers=headers)
            htmlResult=pq(response.text)
            books.append(allBookDetails(htmlResult,bookCount,headers))
        print(books)

    通过kw的值,进行遍历发送获取书籍的请求URL:(参数page的变化)

    http://www.ituring.com.cn/book?tab=free&sort=vote&page=1

    2)书籍总数确定后,要开始获取书籍进入详细介绍页的URL等信息,同样的请参考第三节之前的输入值:

    $(".block-books li")

    这个代码主要是获取所有书籍的列表信息,单个列表里包括了一本书的URL地址,作者,书名等信息。返回的值是一组数组,这块我们要对返回的数组进行遍历获取单本书的信息,如下:使用for循环获取单本书籍信息

    def allBookDetails(htmlResult,bookCount,headers):
        books=[]
        bookItems=htmlResult(".block-books li").items()
        for bookitem in bookItems:
            book={}
            bookCount=bookCount+1
            bookUrl=bookitem.find(".book-img a").attr("href")
            bookName=bookitem.find(".book-img a").attr("title")
            bookAuthor=bookitem.find(".book-info a").text()
            book["url"]="http://www.ituring.com.cn"+bookUrl
            book["name"]=bookName
            book["author"]=bookAuthor
            book["catalogue"]=BookCatalogue(book["url"],headers,bookName)
            books.append(book)
            print("the "+str(bookCount)+"book is crawling over.")
        return books

    我们将获取到的信息存入字典,再将字典最后存入数组,这块的参数主要是为了入库做准备的

    3)获取书籍的目录信息(由网站观察发现目录进入内容页的URL会根据目录的id不同而看到目录对应的内容)所以这个URL的id是必须获取的,参考第三节输入的代码:

    $(".table tr")

    观察网站发现整个目录是展示在一个表格内的,所以我们需要获取表格的每行内的对应的URL信息,代码的编写如下:

    def BookCatalogue(url,headers,bookName):
        bookCatalogue={}
        response=requests.get(url)
        htmlResult=pq(response.text)
        contents=""
        catalogues=htmlResult(".table tr").items()
        
        for catalogue in catalogues:
            catalogueUrl=catalogue.eq(0).find("a").attr("href")
            catalogueName=catalogue.eq(0).find("a").text()
            bookCatalogue["catalogueUrl"]="http://www.ituring.com.cn"+catalogueUrl
            bookCatalogue["catalogueName"]=catalogueName

    同样的我也将获取的信息存入字典,以备入库使用~

    4)目录获取之后,需要获取目录对应的内容数据,也请参考第三节内容~

    $(".article-detail").html()

    这个代码是获取内容页的内容,包含了样式信息,代码解析如下:

    def BookContent(url,headers):
        response=requests.get(url) 
        htmlResult=pq(response.text)
        #contents=htmlResult(".article-detail").text().encode('UTF-8')
        content=htmlResult(".article-detail").html().encode('UTF-8')
        return content

    四.END


    以上就是整个爬取页面信息的全部过程,后续我们需要将这些信息全部存入数据库;同样的,你在观看演示的时候会发现性能不好,执行时间过长,这项后续也会讲解优化过程~

  • 相关阅读:
    Eclipse 3.7 安装Maven插件时报错:requires 'bundle org.slf4j.api 1.6.2' but it could not be found
    Windows下IIS+PHP5.3.x ZendGuardLoader的配置方法
    IIS7.x运行PHP
    顺手的Linux发行版及其工具推荐
    nc 简单的使用
    nginx日志简单分析工具
    批量转换cue文件编码
    Linux Tweak:交换 Caps_Lock 与 Control_R
    Word 2013测试
    start running 开始跑步减肥
  • 原文地址:https://www.cnblogs.com/VVsky/p/11183011.html
Copyright © 2011-2022 走看看