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. 爬取结果
数据库内存储的信息在这里插入图片描述

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

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

爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。
Python爬取起点中文网并生成CSV文件而不使用BeautifulSoup库,你可以选择`requests`库用于发送HTTP请求获取HTML内容,然后使用`re`模块进行正则表达式解析提取你需要的数据,最后利用`pandas`库将数据转换成DataFrame,并保存为CSV。 以下是一个简单的示例步骤: 1. 安装必要的库(如果尚未安装): ```bash pip install requests pandas ``` 2. 使用`requests`获取网页源码: ```python import requests url = "https://www.qidian.com/" # 起点中文网首页或其他章节页面URL response = requests.get(url) html_content = response.text ``` 3. 使用正则表达式解析提取所需信息: ```python import re # 示例:假设你要抓取书名、作者和章节链接 book_info_pattern = re.compile(r'(?<=<span class="name">).*?(?=<)', re.S) # 此处需要根据实际HTML结构调整 books = re.findall(book_info_pattern, html_content) chapter_links_pattern = re.compile(r'href="(.*?)"', re.S) # 同理,替换为实际链接匹配规则 chapters = [link.strip() for link in re.findall(chapter_links_pattern, html_content)] ``` 4. 将数据整理成字典列表,准备存入DataFrame: ```python data = [{"book_name": book, "author": "", "chapter_link": chapter} for book, chapter in zip(books[::2], chapters)] # 假设每两本书对应一个章节 ``` 5. 使用`pandas`创建DataFrame并保存为CSV: ```python import pandas as pd df = pd.DataFrame(data) df.to_csv("起点小说.csv", index=False) ``` 请注意,这个例子非常基础且可能因网站结构变化而失效。实际上,为了更稳定地爬取,你应该分析网页的HTML结构(例如使用`lxml`或`html.parser`),而不是依赖于固定的正则表达式。同时,尊重网站的robots.txt协议以及设置合理的延迟时间避免对服务器造成过多压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值