游戏蛮牛学习群(纯技术交流,不闲聊):159852603
游戏蛮牛 手机端
开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:2313

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 3580|回复: 56

[东方喵] 【Python】(一)爬虫程序

[复制链接]  [移动端链接]
排名
792
昨日变化
2

36

主题

815

帖子

3537

积分

Rank: 9Rank: 9Rank: 9

UID
76248
好友
21
蛮牛币
19068
威望
0
注册时间
2015-2-28
在线时间
940 小时
最后登录
2018-9-22

专栏作家蛮牛译员活力之星七夕浪漫情人

发表于 2017-12-19 16:00:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 东方喵 于 2018-9-2 09:20 编辑

【Python】(一)爬虫程序

往往一提到爬虫程序,就感觉很高科技,一个带着大墨镜的家伙坐在满屏幕1010101010101...的电脑面前。然而,事实并非如此。

——题记



何为爬虫程序?

所谓的爬虫程序,可以理解为只是让程序按照你所指定的规则方迅速的获取一些信息的程序,即,对某一行为的快速循环模仿。



举个栗子:

你是如何看见现在这篇文章的呢?是首先访问的蛮牛主页,点击作家专栏访问作家专栏页面,然后在列表中点击这篇文章才看见这篇文章。

而如果要用爬虫程序爬取这篇文章,就是让爬虫程序模拟你刚刚的操作,依次向蛮牛服务器发送请求,然后获取这篇文章。

也就是说,爬虫程序只能爬取的到,你手动点可以获取到的东西。


以下部分对python萌新略不友好,先解释一下,我引用了python的BeautifulSoup和requests两个非buildin的模块,需分别下载安装,百度有详细教程,不予赘述。


日前,我一小同学想做一个阅读器玩,需要大量的小说。我便随手使用python搓了一个:

思路:选择笔趣阁的全部小说页面为爬取的目标,因为在这一页面上可以获取全部小说总目录的url,然后,再获取每个章节的url,最后按照目录,逐个将小说的content写入本地txt。

code如下:

[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
#爬取http://www.biquge5200.com笔趣阁全部小说

import time
import re    
import urllib.request as request      
from bs4 import BeautifulSoup      
import requests   
import os

def create_folder():#创建根文件夹
    b = os.path.exists("C:\\textPython")
    if b:
        print('目录已存在')
    else:
        os.makedirs("C:\\textPython")

def create_sub_folder(name):#创建小说子文件夹
    b = os.path.exists("C:\\textPython\\"+name.replace(' ', '').replace(':', ':').replace('*',''))
    if b:
        print('子目录已存在')
    else:
        os.makedirs("C:\\textPython\\"+name.replace(' ', '').replace(':', ':').replace('*',''))
    

def create_doc(path,content):#创建txt章节文件
    print('创建txt:'+path+".txt")
    file_s=path+".txt"
    file = open(file_s,'w+',encoding='utf-8')
    file.write(content)
    file.close

def get_novel_content(url):#获取章节内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }
    response = request.urlopen(request.Request(url,headers=headers))
    content = response.read().decode('gb18030','ignore')
    soup = BeautifulSoup(content, 'html.parser')
    text = soup.find('div',id="content").get_text()
    time.sleep(0.4)
    return text  

def get_novel_list(url,path):#获取章节链接
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }
    response = request.urlopen(request.Request(url,headers=headers))
    content = response.read().decode('gb18030','ignore')
    soup = BeautifulSoup(content, 'html.parser')
    for link in soup.find_all('a'):
        text=link.get('href')
        if text:
            textMathch= re.match(r'http://www.biquge5200.com/\d+_\d+/\d+\.html',text,re.M)
            if textMathch:
                name=link.string
                print('添加小说章节链接:'+textMathch.group()+name)
                content=get_novel_content(text)
                create_doc(path+'\\'+name,content)
            else:
                print('链接错误!'+text)
        else:
            print('链接为空!')

def get_title(url):#获取标题
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }
    response = request.urlopen(request.Request(url,headers=headers))
    content = response.read().decode('gb18030','ignore')
    soup = BeautifulSoup(content, 'html.parser')
    for link in soup.find_all('a'):
        text=link.get('href')
        textMathch= re.match(r'http://www.biquge5200.com/\d+_\d+/',text,re.M)
        if textMathch:
            name=link.string
            print('添加小说目录链接:'+textMathch.group()+name.replace(' ', '').replace(':', ':').replace('*',''))
            create_sub_folder(name)
            get_novel_list(textMathch.group(),"C:\\textPython\\"+name.replace(' ', '').replace(':', ':').replace('*',''))
        else:
            print('链接错误!'+text)
  
create_folder()
urltitle='http://www.biquge5200.com/xiaoshuodaquan/'
get_title(urltitle) 



532192602760496453.png


但是,我小同学想要完本的小说,而笔趣阁上的完本并不多,并且总共只有3000本小说。于是乎,把爬取的目标转移到起点读书:

思路:与上方类似,从起点读书的完本页面开始爬,获取本页小说的url,递归获取下一页url,直到尾页。

code如下:

[Python] 纯文本查看 复制代码
#!/usr/bin/env python3
#https://www.qidian.com起点读书全部完本小说
# /:*?“<>|

import time
import re    
import urllib.request as request      
from bs4 import BeautifulSoup      
import requests   
import os
import sys
 
def create_folder():#创建根文件夹
    b = os.path.exists("C:\\textPython")
    if b:
        print('目录已存在')
    else:
        os.makedirs("C:\\textPython")

def create_sub_folder(name):#创建小说子文件夹
    b = os.path.exists("C:\\textPython\\"+name.replace(' ', '_').replace(':', ':').replace('\\', '').replace('/', '').replace('*', '').replace('?','').replace('"','').replace('>','').replace('<','').replace('|',''))
    if b:
        print('子目录已存在')
    else:
        os.makedirs("C:\\textPython\\"+name.replace(' ', '_').replace(':', ':').replace('\\', '').replace('/', '').replace('*', '').replace('?','').replace('"','').replace('>','').replace('<','').replace('|',''))
    

def create_doc(path,content):#创建txt章节文件
    print('创建txt:'+path+".txt")
    file_s=path+".txt"
    file = open(file_s,'w+',encoding='utf-8')
    file.write(content)
    file.close

def get_novel_content(url,path):#获取章节内容
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }
    response = request.urlopen(request.Request(url,headers=headers))
    content = response.read().decode('utf-8','ignore')
    soup = BeautifulSoup(content, 'html.parser')
    text=''
    name=''
    for s in soup.find_all('h3'):
        if s:
            if s.get('class')==['j_chapterName']:
                name=s.string.replace(' ', '_').replace(':', ':').replace('\\', '').replace('/', '').replace('*', '').replace('?','').replace('"','').replace('>','').replace('<','').replace('|','')
                print('章节标题:'+name)
    t = soup.find('div',{'class':'read-content j_readContent'})
    t=t.get_text().replace('\xa0','')
    time.sleep(0.1)
    create_doc(path+'\\'+name,t)
    uu=soup.find('a',id='j_chapterNext')
    if uu:
        u=uu.get('href')
        if uu.string=='下一章':
            get_novel_content('https:'+u,path)

def get_novel_list(url,path):#获取章节链接
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }
    response = request.urlopen(request.Request(url,headers=headers))
    content = response.read().decode('utf-8','ignore')
    soup = BeautifulSoup(content, 'html.parser')
    for link in soup.find_all('a'):
        text=link.get('id')
        if text=='readBtn':
            s=link.get('href')
            get_novel_content('https:'+s,path)

def get_title(url):#获取标题
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }
    response = request.urlopen(request.Request(url,headers=headers))
    content = response.read().decode('utf-8','ignore')
    soup = BeautifulSoup(content, 'html.parser')
    for link in soup.find_all('a'):
        text=link.get('href')
        textMathch= re.match(r'//book\.qidian\.com/info/\d+',text,re.M)
        if textMathch:
            name=link.string
            if name: 
                print('添加小说目录链接:'+textMathch.group()+name.replace(' ', '_').replace(':', ':').replace('\\', '').replace('/', '').replace('*', '').replace('?','').replace('"','').replace('>','').replace('<','').replace('|',''))
                create_sub_folder(name)
                get_novel_list('https:'+textMathch.group(),"C:\\textPython\\"+name.replace(' ', '_').replace(':', ':').replace('\\', '').replace('/', '').replace('*', '').replace('?','').replace('"','').replace('>','').replace('<','').replace('|',''))
    u=soup.find('div',{'class':'lbf-pagination-item'}).get('href')
    get_title('https:'+u)

sys.setrecursionlimit(1000000) 
create_folder()
urltitle='https://www.qidian.com/finish/'
urlList= get_title(urltitle)



0.png


小细节:

1.发送的请求加上合法的头,以假装自己是真正的普通浏览器

[Python] 纯文本查看 复制代码
headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
    }



2.请求需要有一定的时间间隔,否则可能会被发现

[Python] 纯文本查看 复制代码
time.sleep(0.1)



3.python的for循环默认999为上限,有些长篇小说动辄上千章,需要手动设置上限,我设的是一百万次

[Python] 纯文本查看 复制代码
sys.setrecursionlimit(1000000)



4.由于是以文件存储,所以 /:*?“<>|等这些特殊字符是不能用于文件名的,需要剔除掉(因为发现真的有用特殊字符做标题的文章)

[Python] 纯文本查看 复制代码
name=s.string.replace(' ', '_').replace(':', ':').replace('\\', '').replace('/', '').replace('*', '').replace('?','').replace('"','').replace('>','').replace('<','').replace('|','')



声明:本文仅用于技术分享,请勿用于非法行为哦~

最后附上BeautifulSoup和requests:
beautifulsoup4-4.6.0.tar.gz (157.08 KB, 下载次数: 159)

评分

参与人数 4鲜花 +17 收起 理由
wwb + 2 很给力!
lilexy + 5 很给力!
Gilbert + 5 很给力!
liujiachaoshun + 5 逆天操作!!!!!!!!!!!.

查看全部评分

本帖被以下淘专辑推荐:

  • · I Like|主题: 85, 订阅: 8

回复

使用道具 举报

7日久生情
2290/5000
排名
2910
昨日变化
3

9

主题

1114

帖子

2290

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
168159
好友
4
蛮牛币
5095
威望
0
注册时间
2016-9-12
在线时间
691 小时
最后登录
2018-9-21
发表于 2017-12-19 16:23:56 | 显示全部楼层

回复

使用道具 举报

6蛮牛粉丝
1349/1500
排名
2694
昨日变化
1

1

主题

489

帖子

1349

积分

Rank: 6Rank: 6Rank: 6

UID
220310
好友
1
蛮牛币
2304
威望
0
注册时间
2017-5-2
在线时间
359 小时
最后登录
2018-6-13
发表于 2017-12-19 16:28:30 | 显示全部楼层

回复

使用道具 举报

7日久生情
1946/5000
排名
1641
昨日变化

36

主题

643

帖子

1946

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
174225
好友
1
蛮牛币
12
威望
0
注册时间
2016-10-9
在线时间
529 小时
最后登录
2018-9-19
QQ
发表于 2017-12-19 16:40:27 | 显示全部楼层
谢谢分享
[发帖际遇]: 一个袋子砸在了 冰凉的爱 头上,冰凉的爱 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复

使用道具 举报

6蛮牛粉丝
1346/1500
排名
2862
昨日变化
10

11

主题

558

帖子

1346

积分

Rank: 6Rank: 6Rank: 6

UID
214924
好友
3
蛮牛币
3202
威望
0
注册时间
2017-3-28
在线时间
299 小时
最后登录
2018-9-21
发表于 2017-12-19 16:47:35 | 显示全部楼层
好6 ,唉看来我还差得远,我现在拿到都要考虑咋用。。。。。。。。。。。

回复 支持 反对

使用道具 举报

7日久生情
2625/5000
排名
3274
昨日变化
15

2

主题

1812

帖子

2625

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
241666
好友
0
蛮牛币
10182
威望
0
注册时间
2017-9-6
在线时间
387 小时
最后登录
2018-9-21
发表于 2017-12-20 07:38:35 来自Mobile--- | 显示全部楼层
感谢分享

回复

使用道具 举报

7日久生情
3238/5000
排名
2047
昨日变化
15

0

主题

2116

帖子

3238

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
219676
好友
1
蛮牛币
2411
威望
0
注册时间
2017-7-12
在线时间
494 小时
最后登录
2018-9-21

活力之星

发表于 2017-12-20 09:21:51 | 显示全部楼层
谢谢分享

回复

使用道具 举报

5熟悉之中
767/1000
排名
3696
昨日变化
1

0

主题

152

帖子

767

积分

Rank: 5Rank: 5

UID
254155
好友
0
蛮牛币
1037
威望
0
注册时间
2017-11-13
在线时间
239 小时
最后登录
2018-9-18
发表于 2017-12-20 09:40:31 | 显示全部楼层
对新手太不友好

回复

使用道具 举报

4四处流浪
410/500
排名
12806
昨日变化
14

3

主题

144

帖子

410

积分

Rank: 4

UID
216830
好友
2
蛮牛币
298
威望
0
注册时间
2017-4-9
在线时间
202 小时
最后登录
2018-9-21
发表于 2017-12-20 09:47:40 | 显示全部楼层
谢谢分享

回复

使用道具 举报

7日久生情
1786/5000
排名
1497
昨日变化
4

2

主题

338

帖子

1786

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
151630
好友
4
蛮牛币
2073
威望
0
注册时间
2016-6-12
在线时间
650 小时
最后登录
2018-9-20
发表于 2017-12-20 09:50:31 | 显示全部楼层
看完整篇。。。一脸懵逼,但是感觉很厉害哦

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1409/1500
排名
2792
昨日变化
9

0

主题

553

帖子

1409

积分

Rank: 6Rank: 6Rank: 6

UID
182268
好友
2
蛮牛币
711
威望
0
注册时间
2016-11-9
在线时间
370 小时
最后登录
2018-9-21
发表于 2017-12-20 09:54:49 | 显示全部楼层
对某一行为的快速循环模仿

回复 支持 反对

使用道具 举报

4四处流浪
434/500
排名
6544
昨日变化
3

0

主题

102

帖子

434

积分

Rank: 4

UID
139869
好友
0
蛮牛币
574
威望
0
注册时间
2016-3-14
在线时间
142 小时
最后登录
2018-5-14
发表于 2017-12-20 10:18:44 | 显示全部楼层
thank u for share

回复

使用道具 举报

排名
869
昨日变化
1

16

主题

1126

帖子

3143

积分

Rank: 9Rank: 9Rank: 9

UID
68430
好友
13
蛮牛币
11259
威望
0
注册时间
2015-1-14
在线时间
841 小时
最后登录
2018-9-21
发表于 2017-12-20 10:40:46 | 显示全部楼层
虽然不明白,但是感觉有点像黑客的意思吧??

回复 支持 反对

使用道具 举报

6蛮牛粉丝
1106/1500
排名
2530
昨日变化
11

1

主题

192

帖子

1106

积分

Rank: 6Rank: 6Rank: 6

UID
192151
好友
0
蛮牛币
1842
威望
0
注册时间
2016-12-14
在线时间
387 小时
最后登录
2018-9-21
发表于 2017-12-20 10:50:11 | 显示全部楼层
膜拜

回复

使用道具 举报

7日久生情
1714/5000
排名
1391
昨日变化

29

主题

380

帖子

1714

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
89788
好友
1
蛮牛币
3369
威望
0
注册时间
2015-4-7
在线时间
461 小时
最后登录
2018-9-20
发表于 2017-12-20 10:50:45 | 显示全部楼层
看过有人用爬虫爬知乎头像的

工具是正经工具,就是不知道什么人用。。。。。
hhhhhhhhhhhhhh
[发帖际遇]: 一个袋子砸在了 被游戏打的佑子 头上,被游戏打的佑子 赚了 1 蛮牛币. 幸运榜 / 衰神榜

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

关闭

站长推荐 上一条 /1 下一条

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