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


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

  • 相关阅读:
    Leetcode 50.Pow(x,n) By Python
    Leetcode 347.前K个高频元素 By Python
    Leetcode 414.Fizz Buzz By Python
    Leetcode 237.删除链表中的节点 By Python
    Leetcode 20.有效的括号 By Python
    Leetcode 70.爬楼梯 By Python
    Leetcode 190.颠倒二进制位 By Python
    团体程序设计天梯赛 L1-034. 点赞
    Wannafly挑战赛9 C-列一列
    TZOJ Start
  • 原文地址:https://www.cnblogs.com/VVsky/p/11183011.html
Copyright © 2011-2022 走看看