爬虫(4)_代码分析

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

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

[若是你有其余测试领域的想法,也能够私信我发稿给我在公众号上展现哦]python


一.演示数据库


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

[请关注公众号观看]后端

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

二.安装数组


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

pip install requestspip install PyQuery

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

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


以上就是整个爬取页面信息的所有过程,后续咱们须要将这些信息所有存入数据库;一样的,你在观看演示的时候会发现性能很差,执行时间过长,这项后续也会讲解优化过程~

相关文章
相关标签/搜索