爬虫(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



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

原文地址:https://www.cnblogs.com/VVsky/p/11183011.html

时间: 2024-10-09 10:49:02

爬虫(4)_代码分析的相关文章

【Heritrix源代码分析4】开始一个爬虫抓取的全流程代码分析

在创建一个job后,就要开始job的运行,运行的全流程如下: 1.在界面上启动job 2.index.jsp 查看上述页面对应的源代码 <a href='"+request.getContextPath()+"/console/action.jsp?action=start'>Start</a> 3.action.jsp String sAction = request.getParameter("action"); if(sAction !

《linux 内核完全剖析》 keyboard.S 部分代码分析(key_map)

keyboard.S 部分代码分析(key_map) keyboard中间有这么一段,我一开始没看明白,究竟啥意思 key_map: .byte 0,27 .ascii "1234567890-=" .byte 127,9 .ascii "qwertyuiop[]" .byte 13,0 .ascii "asdfghjkl;'" .byte '`,0 .ascii "\\zxcvbnm,./" .byte 0,'*,0,32

《linux 内核完全剖析》 exit.c 代码分析笔记

exit.c 代码分析笔记 release 释放进程的函数release() 主要根据指定进程的任务数据结构指针,在任务数组中删除指定的进程指针,释放相关内存页,并立刻让内核重新调度进程的运行. void release(struct task_struct * p) //释放p指向的进程 { int i; if (!p) //常规检测p是否为0 return; if (p == current) { //不能把自己给释放了 printk("task releasing itself\n\r&q

characterCustomezition的资源打包代码分析

using System.Collections.Generic; using System.IO; using UnityEditor; using UnityEngine; class CreateAssetbundles { // This method creates an assetbundle of each SkinnedMeshRenderer // found in any selected character fbx, and adds any materials that

完整全面的Java资源库(包括构建、操作、代码分析、编译器、数据库、社区等等)

构建 这里搜集了用来构建应用程序的工具. Apache Maven:Maven使用声明进行构建并进行依赖管理,偏向于使用约定而不是配置进行构建.Maven优于Apache Ant.后者采用了一种过程化的方式进行配置,所以维护起来相当困难.Gradle:Gradle采用增量构建.Gradle通过Groovy编程而不是传统的XML声明进行配置.Gradle可以很好地配合Maven进行依赖管理,并且把Ant脚本当作头等公民.字节码操作 编程操作Java字节码的函数库. ASM:通用底层字节码操作及分析

scrapy-redis实现爬虫分布式爬取分析与实现

一 scrapy-redis实现分布式爬取分析 所谓的scrapy-redis实际上就是scrapy+redis其中对redis的操作采用redis-py客户端.这里的redis的作用以及在scrapy-redis的方向我在自己fork的repository(链接:)已经做了翻译(README.rst). 在前面一篇文章中我已经借助两篇相关文章分析了使用redis实现爬虫分布式的中心.归结起来就是:所有爬虫获取到的url(request)都放到一个redis queue中,并且所有爬虫都从单个r

(原创)cocos2d-x 3.0 示例代码分析1:AppDelegate

星月最近在用3.0做类似刀塔游戏,第一次用3.0,之前一直只是查查资料,最近发现做一些特定行为需要对3.0一些新的特性了解.所以趁这个机会,把3.0的测试代码过一遍,同时增加注释,希望能对大家有帮助~ 因为项目原因,所以不定期更新~~(小白:借口,继续找借口!) 星月倾心贡献~~~ // AppDelegate.cpp /**************************************************************************** Copyright (

代码分析之-再析《Flappy Pig》被高手破解

引用链接:<Flappy Pig>被高手破解,代码分析 前两天看到这篇文章, 有一种IOCCC的风格. 忍不住就做了下面的分析, 不足之处希望有高人不吝赐教, 先在此谢过. 很可惜, 是自动生成的. 不过还是有很多非常值得学习的地方. _ = ~[]; // -1;  /* 利用空数组和弱类型语言特性按位取反的来, 忽略类型js中空数组的值是与false和0相等的 */ _ = { ___ : ++_, // 0, 自增一 $$$$ : (![] + "")[_], // 

开源项目kcws代码分析--基于深度学习的分词技术

http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi-LSTM+CRF) 如何深度理解Koth的深度分词? 简单的说,kcws的分词原理就是: 对语料进行处理,使用word2vec对语料的字进行嵌入,每个字特征为50维. 得到字嵌入后,用字嵌入特征喂给双向LSTM, 对输出的隐层加一个线性层,然后加一个CRF就得到本文实现的模型. 于最优化方法,文本