Python7个爬虫小案例详解(附源码)上篇

 更新时间:2023年01月11日 17:05:27   作者:艾派森  
这篇文章主要介绍了Python7个爬虫小案例详解(附源码)上篇,本文章内容详细,通过案例可以更好的理解爬虫的相关知识,七个例子分为了三部分,本次为上篇,共有二道题,需要的朋友可以参考下

本次的7个python爬虫小案例涉及到了re正则、xpath、beautiful soup、selenium等知识点,非常适合刚入门python爬虫的小伙伴参考学习。

前言

关于Python7个爬虫小案例的文章分为三篇,本篇为上篇,共两题,其余两篇内容请关注!

题目一:

使用正则表达式和文件操作爬取并保存“百度贴吧”某帖子全部内容(该帖不少于5页)

 本次选取的是百度贴吧中的NBA吧中的一篇帖子,帖子标题是“克莱和哈登,谁历史地位更高”。爬取的目标是帖子里面的回复内容。

源程序和关键结果截图:

import csv
import requests
import re
import time
 
def main(page):
    url = f'https://tieba.baidu.com/p/7882177660?pn={page}'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'
    }
    resp = requests.get(url,headers=headers)
    html = resp.text
    # 评论内容
    comments = re.findall('style="display:;">                    (.*?)</div>',html)
    # 评论用户
    users = re.findall('class="p_author_name j_user_card" href=".*?" rel="external nofollow"  target="_blank">(.*?)</a>',html)
    # 评论时间
    comment_times = re.findall('楼</span><span class="tail-info">(.*?)</span><div',html)
    for u,c,t in zip(users,comments,comment_times):
        # 筛选数据,过滤掉异常数据
        if 'img' in c or 'div' in c or len(u)>50:
            continue
        csvwriter.writerow((u,t,c))
        print(u,t,c)
    print(f'第{page}页爬取完毕')
 
if __name__ == '__main__':
    with open('01.csv','a',encoding='utf-8')as f:
        csvwriter = csv.writer(f)
        csvwriter.writerow(('评论用户','评论时间','评论内容'))
        for page in range(1,8):  # 爬取前7页的内容
            main(page)
            time.sleep(2)

题目二:

实现多线程爬虫爬取某小说部分章节内容并以数据库存储(不少于10个章节) 

 本次选取的小说网址是全本小说网https://www.qb5.tw/,这里我们选取第一篇小说进行爬取

然后通过分析网页源代码分析每章小说的链接

找到链接的位置后,我们使用Xpath来进行链接和每一章标题的提取

在这里,因为涉及到多次使用requests发送请求,所以这里我们把它封装成一个函数,便于后面的使用

每一章的链接获取后,我们开始进入小说章节内容页面进行分析

通过网页分析,小说内容都在网页源代码中,属于静态数据

这里我们选用re正则表达式进行数据提取,并对最后的结果进行清洗

然后我们需要将数据保存到数据库中,这里我将爬取的数据存储到mysql数据库中,先封住一下数据库的操作

接着将爬取到是数据进行保存

最后一步就是使用多线程来提高爬虫效率,这里我们创建了5个线程的线程池

 源代码及结果截图:

import requests
from lxml import etree
import re
import pymysql
from time import sleep
from concurrent.futures import ThreadPoolExecutor
 
def get_conn():
    # 创建连接
    conn = pymysql.connect(host="127.0.0.1",
                           user="root",
                           password="root",
                           db="novels",
                           charset="utf8")
    # 创建游标
    cursor = conn.cursor()
    return conn, cursor
 
def close_conn(conn, cursor):
    cursor.close()
    conn.close()
 
def get_xpath_resp(url):
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36'}
    resp = requests.get(url, headers=headers)
    tree = etree.HTML(resp.text)  # 用etree解析html
    return tree,resp
 
def get_chapters(url):
    tree,_ = get_xpath_resp(url)
    # 获取小说名字
    novel_name = tree.xpath('//*[@id="info"]/h1/text()')[0]
    # 获取小说数据节点
    dds = tree.xpath('/html/body/div[4]/dl/dd')
    title_list = []
    link_list = []
    for d in dds[:15]:
        title = d.xpath('./a/text()')[0]  # 章节标题
        title_list.append(title)
        link = d.xpath('./a/@href')[0]   # 章节链接
        chapter_url = url +link  # 构造完整链接
        link_list.append(chapter_url)
    return title_list,link_list,novel_name
 
def get_content(novel_name,title,url):
    try:
        cursor = None
        conn = None
        conn, cursor = get_conn()
        # 插入数据的sql
        sql = 'INSERT INTO novel(novel_name,chapter_name,content) VALUES(%s,%s,%s)'
        tree,resp = get_xpath_resp(url)
        # 获取内容
        content = re.findall('<div id="content">(.*?)</div>',resp.text)[0]
        # 对内容进行清洗
        content = content.replace('<br />','\n').replace('&nbsp;',' ').replace('全本小说网 www.qb5.tw,最快更新<a href="https://www.qb5.tw/book_116659/" rel="external nofollow" >宇宙职业选手</a>最新章节!<br><br>','')
        print(title,content)
        cursor.execute(sql,[novel_name,title,content])  # 插入数据
        conn.commit()  # 提交事务保存数据
    except:
        pass
    finally:
        sleep(2)
        close_conn(conn, cursor)  # 关闭数据库
 
 
if __name__ == '__main__':
    # 获取小说名字,标题链接,章节名称
    title_list, link_list, novel_name = get_chapters('https://www.qb5.tw/book_116659/')
    with ThreadPoolExecutor(5) as t:  # 创建5个线程
        for title,link in zip(title_list,link_list):
            t.submit(get_content, novel_name,title,link)  # 启动线程

到此这篇关于Python7个爬虫小案例详解(附源码)上篇的文章就介绍到这了,其他两个部分的内容(中、下篇)请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • django项目用higcharts统计最近七天文章点击量

    django项目用higcharts统计最近七天文章点击量

    这篇文章主要介绍了django项目用higcharts统计最近七天文章点击量,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • python中PIL安装简单教程

    python中PIL安装简单教程

    这篇文章主要为大家分享了python中PIL安装简单教程,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 对numpy中的where方法嵌套使用详解

    对numpy中的where方法嵌套使用详解

    今天小编就为大家分享一篇对numpy中的where方法嵌套使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • Python中tell()方法的使用详解

    Python中tell()方法的使用详解

    这篇文章主要介绍了Python中tell()方法的使用详解,是Python入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • Python操作word实现添加文字或图片水印

    Python操作word实现添加文字或图片水印

    这篇文章主要为大家详细介绍了如何使用Spire.Doc for Python在程序中的轻松添加文字和图像水印到Word文档,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-10-10
  • pandas 数据实现行间计算的方法

    pandas 数据实现行间计算的方法

    今天小编就为大家分享一篇pandas 数据实现行间计算的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • python程序变成软件的实操方法

    python程序变成软件的实操方法

    在本篇文章里小编给大家整理的是关于python程序变成软件的相关方法和具体操作流程,有需要的朋友们可以参考下。
    2019-06-06
  • Python3 ID3决策树判断申请贷款是否成功的实现代码

    Python3 ID3决策树判断申请贷款是否成功的实现代码

    这篇文章主要介绍了Python3 ID3决策树判断申请贷款是否成功的实现代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 对pandas中Series的map函数详解

    对pandas中Series的map函数详解

    今天小编就为大家分享一篇对pandas中Series的map函数详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python实现简单的获取图片爬虫功能示例

    Python实现简单的获取图片爬虫功能示例

    这篇文章主要介绍了Python实现简单的获取图片爬虫功能,涉及Python使用urllib模块及正则模块操作页面元素获取图片的相关技巧,需要的朋友可以参考下
    2017-07-07

最新评论