Bootstrap

Python爬虫之爬取起点中文网

python之爬取起点中文网

最近学了爬虫,想实战一下就选取了最近经常看小说的起点中文网来进行爬取
过程如下:

  1. 分析爬取信息
    爬取网址https://www.qidian.com/rank?chn=-1
    爬取内容在这里插入图片描述
    如上图有不同的分类,有奇幻,玄幻,武侠等分类,我们需要爬取每个分类里的各个排行榜的书名信息和排名信息
    分析网页HTML文本
    在页面HTML源码中找到排行榜内书名和排名所在的位置,分析这些信息在HTML内的结构

  2. 准备的python库工具

    import requests      
    import pymongo   
    from pyquery import PyQuery as pq
    from urllib.parse import urlencode
    

    requests请求库,用来发起页面请求,并获取返回的页面html文本
    pymongo库用来连接MongoDB数据库,操作数据库并存储数据
    pyquery库用来解析HTML文本,定位信息所在的节点,并获取信息
    urllib.prase库中的urlencode是用来在url后面添加参数,构造请求的url的

3.代码分析

  • 请求页面函数部分

    def get_page(chn):
       params  = {
           'chn':chn
       }
       headers = {
           'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
           'Host':'www.qidian.com'}
    
       #把params参数通过urlencode参数添加到url上
       url = 'https://www.qidian.com/rank?' + urlencode(params)
    
       try:
           response = requests.get(url,headers=headers)        #请求url 获取响应
           if response.status_code == 200:
               return response.text            #若响应状态码为200,则返回页面html内容
       except Exception:
           print('Error')
    	```
    
    
  • 获得页面的HTML文本后解析内容爬取想要的信息

    	def get_data(page_html,chn):
    	  
        获得页面的HTML文本后解析内容爬取想要的信息
        :param page_html: 页面的源码
        :param chn: 页码数
        :return: 页面的详细信息
       
        page_info = {}
        list_info = []
        doc = pq(page_html)
        rank_list_row = doc('.rank-list').items()
    
        #获取书的排名
        for item in rank_list_row:
            list_info_ = get_detial_info(item)
            list_info.append(list_info_)
    
        #获书的分类
        book_sort = doc('.type-list p a').items()
        for item in book_sort:
            if chn == int(item.attr('data-chanid')):
                page_info[item.text()] = '{info}'.format(info=list_info)   #把书的排名和书的分类通过字典键值保存起来
                break
        return page_info
    	```
    
    
  • 获取各个排行榜的数据

    def get_detial_info(rank_list):
        '''
        获取页面各个排行榜的书的排名
        :param rank_list: 页面的每个排行榜的不同书的排名
        :return: 排名信息
        '''
        list_info = {}
        book_info = []
        list_name = rank_list.find('.wrap-title').text()[:-3]    #对获取的字符串进行切片处理,获取书名
        book_list = rank_list.find('li').items()                 #获取书在各个排行榜的排名
        for item in book_list:
            book_info_=get_book_info(item)
            book_info.append(book_info_)
        list_info[list_name] = '{info}'.format(info=book_info)   #把书的排名和书的名字通过字典键值存储
        return list_info
    
    
  • 获取书的信息

    def get_book_info(book_list):
        '''
        获取书名,和书的在各个排行榜的排名
        :param book_list:  页面各个排行榜的html文本
        :return: 书名和排名
        '''
        book_rank = book_list.attr('data-rid')
        book_name = book_list.find('a').text()
        return {
            '排名':book_rank,
            '书名':book_name,
        }
    
  • 把信息存储到MongDB上去:

    #连接MongDB数据库,创建集合进行存储信息
    client = pymongo.MongoClient(host='localhost',port=27017)
    DB  = client['Novel']
    collection = DB['Novel_Rank']
    
    def save_to_db(data):
        '''
        把爬取信息存储到mongoDB上
        :param data: 爬取信息
        :return:
        '''
        result = collection.insert_one(data)
        print('save succeed')
    
  • 主函数调用

    	def main():
    	    '''
    	    主函数
    	    :return:
    	    '''
    	    for i in range(1,23):           #遍历页码
    	        text = get_page(i)
    	        page_info = get_data(text,i)
    	        if page_info:                   #如果获取到的字典内有内容则储存
    	            save_to_db(page_info)
    	
    	
    	if __name__ == '__main__':
    	        main()
    	```
    
    

4. 爬取结果
数据库内存储的信息在这里插入图片描述

每个分类的排行榜信息:
在这里插入图片描述

这就完成对于起点中文网的内容爬取啦,对于写的错误和不好的地方大家可以在评论留言,我看到了会及时回复,谢谢大家

;