鱼C论坛

 找回密码
 立即注册
查看: 2598|回复: 6

[作品展示] Python 爬取文章【代码+详解】

[复制链接]
发表于 2020-3-15 16:37:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 LYF511 于 2020-3-16 16:48 编辑

Python 爬取文章【代码+详解】

emm,老师叫我们阅读,看看手里的钱,再看看微信支付宝。。。还是爬吧

看了半天百度,最后还是选择轩宇阅读网

为什么?

因为好爬啊

先看看文章页

示例页


                               
登录/注册后可看大图



                               
登录/注册后可看大图


Σ(っ °Д °;)っ,这么好爬!

赶紧定义一个爬取章节的函数 getChapter:

  1. from requests import get                #导入requests的get                  ,爬取页面用
  2. from bs4 import BeautifulSoup as BS     #导入bs4的BeautifulSoup并命名为BS   ,解析页面用
  3. def getChapter(url):
  4.     """
  5.     获取章节url
  6.     参数说明:
  7.         url:文章链接(字符串)
  8.     返回说明:
  9.         (标题(字符串),链接(列表))
  10.     """
  11.     urls = []                                                     #初始化存放链接的列表
  12.     res = get(url)                                                #爬取页面
  13.     res.encoding = 'gb2312'                                       #设置编码,不然会乱码
  14.     soup = BS(res.text, 'html.parser')                            #设置网页解析
  15.     for each in soup.find('ul', class_='zhangjie2').findAll('li'):#用each取查找class为zhangjie2的ul里的li的列表
  16.         urls.append('https://www.xyyuedu.com'+each.a['href'])     #获取链接
  17.     return soup.h1.text[:-2], urls                                #返回链接及标题
复制代码

章节爬完了,开始爬页数

有的只有一页,有的有很多页


                               
登录/注册后可看大图



                               
登录/注册后可看大图


根据上面的两张图,我们发现:

1.只有一页的的只有ul,没有li,有多页的既有ul,也有li。

2.第一页为https://www.xyyuedu.com/etdw/lbxljxs/34493.html,其他页为https://www.xyyuedu.com/etdw/lbxljxs/34493_页数.html。

根据规律,我们可以写出提取页数程序 getPages:

  1. def getPages(urls):
  2.     """
  3.     获取章节页数(批量)
  4.     参数说明:
  5.         urls:要获取的链接(批量)(列表)
  6.     返回说明:
  7.         链接(列表)
  8.     """
  9.     Urls = []                                                                 #初始化存放链接的列表
  10.     for eachUrl in urls:                                                      #用eachUrl取每个链接
  11.         Urls.append(eachUrl)                                                  #添加此链接(第一页)
  12.         soup = BS(get(eachUrl).text, 'html.parser')                           #爬取页面并设置网页解析
  13.         li = soup.find('div', class_='list-pages page-center').findAll('li')  #获取页数表
  14.         if li == []:                                                          #如果为空(只有第一页)
  15.             continue                                                          #跳过本次循环,继续下一轮循环
  16.         pages = int(li[len(li)-2].a.text)                                     #获取总页数
  17.         for page in range(2, pages+1):                                        #根据规律循环页数
  18.             Urls.append(eachUrl[:-5]+'_'+str(page)+'.html')                   #根据规律添加链接
  19.     return Urls                                                               #返回链接
复制代码

接下来,就是获取内容了


                               
登录/注册后可看大图


太简单了,内容都在p里面

  1. def getText(urls):
  2.     """
  3.     获取文字(批量)
  4.     参数说明:
  5.         urls:要获取的链接(批量)(列表)
  6.     返回说明:
  7.         文字(列表)
  8.     """
  9.     allText = []                                               #初始化存放文字的列表
  10.     for eachUrl in urls:                                       #用eachUrl循环每个链接
  11.         text = []                                              #初始化本页存放文字的列表
  12.         res = get(eachUrl)                                     #爬取页面
  13.         res.encoding = 'gb2312'                                #设置编码,不然会乱码
  14.         soup = BS(res.text, 'lxml')                            #设置网页解析(由于网页不标准,所以要用lxml作为解析器)
  15.         for p in soup.find('div', id="onearcxsbd").findAll('p'):  #用each取查找id为arcxsbd的div里的p标签的列表
  16.             p = p.text                                         #提取文字
  17.             p = p.replace('\n', '')                            #过滤换行符(\n)
  18.             p = p.replace('\t', '')                            #过滤tab(\t)
  19.             p = p.replace('\u3000', '')                        #过滤不知道是说明符号的符号
  20.             if not(p == '' or p.isspace()):                    #如果不是空行
  21.                 text.append(p)                                 #添加文字到列表
  22.         allText.append([soup.h1.text, text])                   #添加本章节名和文字到文字列表
  23.     return allText                                             #返回文字列表
复制代码


需要注意的是,BeautifulSoup时解析器要写lxml,因为网页不标准

最后,来定义一个写入docx的方法:

  1. def writeDocx(title, text):
  2.     """
  3.     写入文档
  4.     参数说明:
  5.         title:标题
  6.         text:文字
  7.     返回说明:
  8.         无
  9.     """
  10.     doc = Document()                                                              #实例化一个文档
  11.     doc.styles['Normal'].font.name=u'微软雅黑'                                    #设置字体名称
  12.     doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')   #设置字体
  13.     doc.add_heading(title, level=1)                                               #添加标题
  14.     for each in text:                                                             #用each取文字
  15.         doc.add_heading(each[0], level=2)                                         #添加小节标题
  16.         for ph in each[1]:                                                        #用pn取文字
  17.             doc.add_paragraph(ph)                                                 #添加段落
  18.     doc.save(title+'.docx')                                                       #保存文档
复制代码


整体就完工了

完整代码:
游客,如果您要查看本帖隐藏内容请回复


喜欢,别忘了:

                               
登录/注册后可看大图

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
磊之茶 + 1 + 1 + 1 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-15 16:46:43 | 显示全部楼层
虽然看不懂,但是感觉很精彩
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-15 21:29:22 | 显示全部楼层
6
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 15:32:24 | 显示全部楼层
Python 爬取文章【代码+详解】

emm,老师叫我们阅读,看看手里的钱,再看看微信支付宝。。。还是爬吧

看了半天百度,最后还是选择轩宇阅读网

为什么?

因为好爬啊

先看看文章页

示例页


                               
登录/注册后可看大图



                               
登录/注册后可看大图


Σ(っ °Д °;)っ,这么好爬!

赶紧定义一个爬取章节的函数 getChapter:

  1. from requests import get                #导入requests的get                  ,爬取页面用
  2. from bs4 import BeautifulSoup as BS     #导入bs4的BeautifulSoup并命名为BS   ,解析页面用
  3. def getChapter(url):
  4.     """
  5.     获取章节url
  6.     参数说明:
  7.         url:文章链接(字符串)
  8.     返回说明:
  9.         (标题(字符串),链接(列表))
  10.     """
  11.     urls = []                                                     #初始化存放链接的列表
  12.     res = get(url)                                                #爬取页面
  13.     res.encoding = 'gb2312'                                       #设置编码,不然会乱码
  14.     soup = BS(res.text, 'html.parser')                            #设置网页解析
  15.     for each in soup.find('ul', class_='zhangjie2').findAll('li'):#用each取查找class为zhangjie2的ul里的li的列表
  16.         urls.append('https://www.xyyuedu.com'+each.a['href'])     #获取链接
  17.     return soup.h1.text[:-2], urls                                #返回链接及标题
复制代码

章节爬完了,开始爬页数

有的只有一页,有的有很多页


                               
登录/注册后可看大图



                               
登录/注册后可看大图


根据上面的两张图,我们发现:

1.只有一页的的只有ul,没有li,有多页的既有ul,也有li。

2.第一页为https://www.xyyuedu.com/etdw/lbxljxs/34493.html,其他页为https://www.xyyuedu.com/etdw/lbxljxs/34493_页数.html。

根据规律,我们可以写出提取页数程序 getPages:

  1. def getPages(urls):
  2.     """
  3.     获取章节页数(批量)
  4.     参数说明:
  5.         urls:要获取的链接(批量)(列表)
  6.     返回说明:
  7.         链接(列表)
  8.     """
  9.     Urls = []                                                                 #初始化存放链接的列表
  10.     for eachUrl in urls:                                                      #用eachUrl取每个链接
  11.         Urls.append(eachUrl)                                                  #添加此链接(第一页)
  12.         soup = BS(get(eachUrl).text, 'html.parser')                           #爬取页面并设置网页解析
  13.         li = soup.find('div', class_='list-pages page-center').findAll('li')  #获取页数表
  14.         if li == []:                                                          #如果为空(只有第一页)
  15.             continue                                                          #跳过本次循环,继续下一轮循环
  16.         pages = int(li[len(li)-2].a.text)                                     #获取总页数
  17.         for page in range(2, pages+1):                                        #根据规律循环页数
  18.             Urls.append(eachUrl[:-5]+'_'+str(page)+'.html')                   #根据规律添加链接
  19.     return Urls                                                               #返回链接
复制代码

接下来,就是获取内容了


                               
登录/注册后可看大图


太简单了,内容都在p里面

  1. def getText(urls):
  2.     """
  3.     获取文字(批量)
  4.     参数说明:
  5.         urls:要获取的链接(批量)(列表)
  6.     返回说明:
  7.         文字(列表)
  8.     """
  9.     allText = []                                               #初始化存放文字的列表
  10.     for eachUrl in urls:                                       #用eachUrl循环每个链接
  11.         text = []                                              #初始化本页存放文字的列表
  12.         res = get(eachUrl)                                     #爬取页面
  13.         res.encoding = 'gb2312'                                #设置编码,不然会乱码
  14.         soup = BS(res.text, 'lxml')                            #设置网页解析(由于网页不标准,所以要用lxml作为解析器)
  15.         for p in soup.find('div', id="onearcxsbd").findAll('p'):  #用each取查找id为arcxsbd的div里的p标签的列表
  16.             p = p.text                                         #提取文字
  17.             p = p.replace('\n', '')                            #过滤换行符(\n)
  18.             p = p.replace('\t', '')                            #过滤tab(\t)
  19.             p = p.replace('\u3000', '')                        #过滤不知道是说明符号的符号
  20.             if not(p == '' or p.isspace()):                    #如果不是空行
  21.                 text.append(p)                                 #添加文字到列表
  22.         allText.append([soup.h1.text, text])                   #添加本章节名和文字到文字列表
  23.     return allText                                             #返回文字列表
复制代码


需要注意的是,BeautifulSoup时解析器要写lxml,因为网页不标准

最后,来定义一个写入docx的方法:

  1. def writeDocx(title, text):
  2.     """
  3.     写入文档
  4.     参数说明:
  5.         title:标题
  6.         text:文字
  7.     返回说明:
  8.         无
  9.     """
  10.     doc = Document()                                                              #实例化一个文档
  11.     doc.styles['Normal'].font.name=u'微软雅黑'                                    #设置字体名称
  12.     doc.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')   #设置字体
  13.     doc.add_heading(title, level=1)                                               #添加标题
  14.     for each in text:                                                             #用each取文字
  15.         doc.add_heading(each[0], level=2)                                         #添加小节标题
  16.         for ph in each[1]:                                                        #用pn取文字
  17.             doc.add_paragraph(ph)                                                 #添加段落
  18.     doc.save(title+'.docx')                                                       #保存文档
复制代码


整体就完工了

完整代码:
游客,如果您要查看本帖隐藏内容请回复


喜欢,别忘了:

                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-18 15:38:44 | 显示全部楼层
看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-12-25 16:26:29 | 显示全部楼层
goood
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-8 11:57:06 | 显示全部楼层
1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 05:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表