爬虫核心基础第三讲(正则表达式练习:爬取小说,爬取图片)

正则表达式练习

爬取小说

获取每部小说的url

import requests
import re
# 1.我要拿到纯爱小说这个分类所对应的第一页的小说内容

def get_novel_list():
    response = requests.get('http://www.quanshuwang.com/list/3_1.html')
    response.encoding = 'gbk'
    html = response.text

    # 第一次匹配 匹配每一部小说的url
    reg = r'<a target="_blank" href="(.*?)" class="l mr10">'
    print(re.findall(reg,html))

get_novel_list()

获取每部小说章节列表

import requests
import re
# 1.我要拿到纯爱小说这个分类所对应的第一页的小说内容

def get_novel_list():
    response = requests.get('http://www.quanshuwang.com/list/1_1.html')
    response.encoding = 'gbk'
    html = response.text

    # 第一次匹配 匹配每一部小说的url
    reg = r'<a target="_blank" href="(.*?)" class="l mr10">'
    return re.findall(reg,html)

# 2.我们要拿到每一部小说的章节列表

def get_chapter_list(novel_url):
    # 请求小说的url
    response = requests.get(novel_url)
    response.encoding = 'gbk'
    html = response.text
    # 第二次匹配 每一部小说所对应的 开始阅读

    reg = r'<a href="(.*?)" class="reader"'

    print(re.findall(reg,html))


for novel_url in get_novel_list():
    # print(i)
    get_chapter_list(novel_url)
    break  # 暂时不要把每部小说都打开
    # 切记 不用break的时候记得点停止,不然网站会封你的IP

获取每部小说的每章节地址和名字

import requests
import re
# 1.我要拿到纯爱小说这个分类所对应的第一页的小说内容

def get_novel_list():
    response = requests.get('http://www.quanshuwang.com/list/3_1.html')
    response.encoding = 'gbk'
    html = response.text

    # 第一次匹配 匹配每一部小说的url
    reg = r'<a target="_blank" href="(.*?)" class="l mr10">'
    return re.findall(reg,html)

# 2.我们要拿到每一部小说的章节列表

def get_chapter_list(novel_url):
    # 请求小说的url
    response = requests.get(novel_url)
    response.encoding = 'gbk'
    html = response.text
    # 第二次匹配 每一部小说所对应的 开始阅读

    reg = r'<a href="(.*?)" class="reader"'

    # 拿到了章节列表所对应的url
    chapter_list_url = re.findall(reg,html)[0]
    response = requests.get(chapter_list_url)
    response.encoding = 'gbk'

    html = response.text
    # 第三次匹配 匹配不同章节的
    reg = r'<li><a href="(.*?)" title=".*?">(.*?)</a></li>'

    return re.findall(reg,html)


for novel_url in get_novel_list():
    # print(i)
    get_chapter_list(novel_url)
    break  # 暂时不要把每部小说都打开
    # 切记 不用break的时候记得运行一会点停止,不然网站会封你的IP

获取每部小说的url

import requests
import re
# 1.我要拿到纯爱小说这个分类所对应的第一页的小说内容

def get_novel_list():
    response = requests.get('http://www.quanshuwang.com/list/3_1.html')
    response.encoding = 'gbk'
    html = response.text

    # 第一次匹配 匹配每一部小说的url
    reg = r'<a target="_blank" href="(.*?)" class="l mr10">'
    return re.findall(reg,html)

# 2.我们要拿到每一部小说的章节列表

def get_chapter_list(novel_url):
    # 请求小说的url
    response = requests.get(novel_url)
    response.encoding = 'gbk'
    html = response.text
    # 第二次匹配 每一部小说所对应的 开始阅读

    reg = r'<a href="(.*?)" class="reader"'

    # 拿到了章节列表所对应的url
    chapter_list_url = re.findall(reg,html)[0]
    response = requests.get(chapter_list_url)
    response.encoding = 'gbk'

    html = response.text
    # 第三次匹配 匹配不同章节的
    reg = r'<li><a href="(.*?)" title=".*?">(.*?)</a></li>'

    return re.findall(reg,html)

# 获取小说每一章的内容
def get_chapter_content(chapter_url):
    response = requests.get(chapter_url)
    response.encoding = 'gbk'
    print(response.text)

for novel_url in get_novel_list():
    # print(i)
    for chapter_url,chapter_name in get_chapter_list(novel_url):
        # chapter_url = i[0]
        # chapter_url = i[2]
        # print(chapter_url,chapter_name)
        get_chapter_content(chapter_url)
        break
    break  # 暂时不要把每部小说都打开
    # 切记 不用break的时候记得运行一会点停止,不然网站会封你的IP

保存小说内容
(注意:不够完善!)

import requests
import re
# 1.我要拿到纯爱小说这个分类所对应的第一页的小说内容

def get_novel_list():
    response = requests.get('http://www.quanshuwang.com/list/3_1.html')
    response.encoding = 'gbk'
    html = response.text

    # 第一次匹配 匹配每一部小说的url
    reg = r'<a target="_blank" href="(.*?)" class="l mr10">'
    return re.findall(reg,html)

# 2.我们要拿到每一部小说的章节列表

def get_chapter_list(novel_url):
    # 请求小说的url
    response = requests.get(novel_url)
    response.encoding = 'gbk'
    html = response.text
    # 第二次匹配 每一部小说所对应的 开始阅读

    reg = r'<a href="(.*?)" class="reader"'

    # 拿到了章节列表所对应的url
    chapter_list_url = re.findall(reg,html)[0]
    response = requests.get(chapter_list_url)
    response.encoding = 'gbk'

    html = response.text
    # 第三次匹配 匹配不同章节的
    reg = r'<li><a href="(.*?)" title=".*?">(.*?)</a></li>'

    return re.findall(reg,html)

# 获取小说每一章的内容
def get_chapter_content(chapter_url):
    response = requests.get(chapter_url)
    response = requests.get(chapter_url)
    response.encoding = 'gbk'
    html = response.text
    # 第一个 在匹配的过程中()是有特殊意义的所有我们在进行一个转义
    # 第二个 匹配多行内容我们需要re.S
    reg = r'style5\(\);</script>(.*?)<script type="text/javascript">style6\(\)'
    # print(re.findall(reg,html,re.S)[0])

    return re.findall(reg,html,re.S)[0]

for novel_url in get_novel_list():
    # print(i)
    for chapter_url,chapter_name in get_chapter_list(novel_url):
        # chapter_url = i[0]
        # chapter_url = i[2]
        # print(chapter_url,chapter_name)
        chapter_content = get_chapter_content(chapter_url)
        # 保存文件
        fn = open(chapter_name + '.html','w')
        fn.write(chapter_content)
        fn.close()
        # break
    break  # 暂时不要把每部小说都打开
    # 记 不用break的时候记得运行一会点停止,不然网站会封你的IP

爬取图片

瀑布流数据的说明

瀑布流的数据就是网站页面的布局样式

特点:
1.正版以图片为主,按照大小不一的图片排列
2.唯美
3.操纵简单

爬取一张图片

import requests

url = 'https://p1.ssl.qhimg.com/dmsmty/1080_965_/t0145ae61177f02685f.jpg'

with open('1.jpg','ab') as f:
    r = requests.get(url)

    f.write(r.content)

获取所有图片的url

import requests
import re
# 1.拿到目标url
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=88'

# 2.拿到网页代码
r = requests.get(url)
ret = r.text
# print(ret)

# 3.拿到图片对应的url
result = re.findall('"thumbURL":"(.*?)"',ret)
print(result)

保存多张图片

import requests
import re
# 1.拿到目标url
url = 'http://image.baidu.com/search/flip?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=88'

# 2.拿到网页代码
r = requests.get(url)
ret = r.text
# print(ret)

# 3.拿到图片对应的url
result = re.findall('"objURL":"(.*?)"',ret)
# print(result)

# 4.保存图片
# 保存多张图片
for i in result:
    # 拿到图片的名字
    name = i[-10:]
    print(name)
    with open('img/'+name,'wb') as f:
        r = requests.get(i)
        f.write(r.content)

处理图片格式问题

# 解决图片格式问题
    end = re.search('(.jpg|.png|.jpeg|.gif)',name)
    if end == None:
        name =name + '.jpg'

自定义下载图片

import requests
import re
import os
# 1.拿到目标url
word = input('请输入:')
url = 'https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1582558781363_R&pv=&ic=0&nc=1&z=&hd=&latest=&copyright=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&sid=&word='+word

# 判断是否有word文件夹
if not os.path.exists(word):
    os.mkdir(word)

# 2.拿到网页代码
r = requests.get(url)
ret = r.text
# print(ret)

# 3.拿到图片对应的url
result = re.findall('"objURL":"(.*?)"',ret)
# print(result)

# 4.保存图片
# 保存多张图片
for i in result:
    # 拿到图片的名字
    name = i[-10:]
    print(name)

    # 解决图片格式问题
    end = re.search('(.jpg|.png|.jpeg|.gif)$',name)
    if end == None:
        name =name + '.jpg'

    # 解决文件夹路径问题

    name = re.sub('/','',name)


    with open(word + '/'+name,'wb') as f:
        r = requests.get(i)
        f.write(r.content)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值