首页 编程教程正文

Python爬虫练习——文泉书籍信息获取[已更新]

piaodoo 编程教程 2020-02-22 22:15:22 1812 0 python教程

本文来源吾爱破解论坛

本帖最后由 ligxi 于 2020-2-10 16:38 编辑

此代码仅供学习交流!

最近看到论坛的大佬写了很多文泉的爬虫工具,奈何本人能力有限写不出那么高级的爬虫,所以退求其次写个书籍基础信息获取的爬虫吧!

更新:
0.0.3版
新增书籍地址。

0.0.2版
1、加入Cookie是否有效的提示。
2、加入起始页,现在可以指定开始页。
3、修复小bug。

此代码会获取以下信息,有能力的可自行修改参数添加更多信息:

搜狗截图20200207161224.png (207.62 KB, 下载次数: 0)

下载附件  保存到相册

2020-2-7 16:12 上传



注意事项:
1、有些模块是第一次使用,可能存在一些bug,请见谅!
2、网站API端口可能随时会改,所以此代码可能也会随时失效。嗨学网
3、网站目前加强了各种防御,cookie每隔一段时间就会失效,需要重新登录获取,最后在源代码中更改"Cookie"后面的值即可。
4、在代码中加入请求的间隔时间,过快的请求很可能会被服务器拉黑一段时间。可自行修改源代码中的time.sleep()时间,单位为s,比如time.sleep(0.5)或time.sleep(2)都可以。

Cookie获取方式:
登录文泉账号后,在浏览器调出控制台,然后输入document.cookie即可获取,最后复制包括引号的所有Cookie信息。

搜狗截图20200207155818.png (61.16 KB, 下载次数: 0)

下载附件  保存到相册

2020-2-7 16:00 上传



最后送给大家一份刚获取的有关Python书籍的数据嗨学网
Python书籍信息:
https://www.lanzous.com/i94zcni
源码:
https://www.lanzous.com/i97pl9g

需要安装的第三方库:
pip install python-docx
pip install requests

代码示例:
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-

import urllib.parse
import string
import requests
import json
import re
import time
import os
import sys

# doc文档模块
from docx import Document
from docx.shared import Inches
from docx.oxml.ns import qn

# cookie修改
Cookie = 'PHPSESSID=5s6umsm3ic7hmp9djhkia854s9; _gid=398749400617; _gidv=9e54db532452f68408485a0f3f20a1b1'
# 接收用户输入的关键字
flag = True
keyword = ''
while flag:
    keyword = input('请输入搜索的关键字:')
    if keyword:
        flag = False
    else:
        print('关键字为空,请重新输入!')

# 要发送的请求
wqxuetang_url = r'https://lib-nuanxin.wqxuetang.com/v1/search/initsearch'
# 字符转码
new_wqxuetang_url = urllib.parse.quote(wqxuetang_url, safe=string.printable)


# 发送请求
def get_response(page=1):
    # 请求头
    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept - Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Connection': 'keep-alive',
        'Host': 'lib-nuanxin.wqxuetang.com',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
        'Cookie': Cookie
    }
    # 要发送的数据
    data = {
        'kw': keyword,
        'type': 1,
        'begindate': '',
        'enddate': '',
        'tid': '',
        'libclass': '',
        'cnclass': '',
        'tag': '',
        'author': '',
        'pn': page,
        'size': 10,
        'isfquery': 'undefined',
        'sort': 1
    }
    # 发送请求,带数据和请求头
    response = requests.post(url=new_wqxuetang_url, data=data, headers=headers)
    # 转为JSON对象
    dict_str = json.loads(response.text)
    return dict_str


# 保存数据
def data_download(dict_str):
    global count
    # 匹配网页标签并替换
    rec = re.compile('</?[a-zA-Z]+\s?\d?/?>')
    # 写入文件
    for item in dict_str['data']['list']:
        # 分割线
        data1 = '{0}【华丽的分割线】{0}\n'.format('*' * 30)
        f1.write(data1)
        # 书ID号
        data2 = '书的ID号:%s\n' % item['numid']
        f1.write(data2)
        print('BID:%s\t' % item['numid'], end='')
        # 书名
        book_name = item['name']
        result = set(re.findall(rec, book_name))
        for ret in result:
            book_name = book_name.replace(ret, '')
        data3 = '书名:《%s》\n' % book_name
        f1.write(data3)
        print('书名:《%s》\t' % book_name, end='')
        # 作者
        data4 = '作者:%s\n' % item['author']
        f1.write(data4)
        # 出版时间
        data5 = '出版时间:%s\n' % item['pubdate']
        f1.write(data5)
        print('出版时间:%s' % item['pubdate'])
        # 出版社
        data6 = '出版社:%s\n' % item['pub']
        f1.write(data6)
        # 图书简介
        des = item['descript']
        result = set(re.findall(rec, des))
        for ret in result:
            des = des.replace(ret, '')
        data7 = '图书简介 :%s\n' % des
        f1.write(data7)
        data8 = '书籍地址:[url=https://lib-nuanxin.wqxuetang.com/#/Book/%s]https://lib-nuanxin.wqxuetang.com/#/Book/%s[/url]\n\n' % item['numid']
        f1.write(data8)
        # 刷新缓存区
        f1.flush()

        # 图片请求头
        img_headers = {
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept - Encoding': 'gzip, deflate, br',
            'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
            'Connection': 'keep-alive',
            'Host': 'bookask-cover.oss-cn-beijing.aliyuncs.com',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0',
            'Cookie': Cookie
        }

        # 拿到图片的请求地址
        img_url = item['coverurl']
        # 发送请求
        img_data = requests.get(url=img_url, headers=img_headers)
        # 发送间隔
        time.sleep(2)
        # 把图片写入本地目录
        img_count = '%s\\%s.jpg' % (pt, count)
        with open(img_count, 'wb') as fp:
            fp.write(img_data.content)

        # 把书籍信息写入doc
        data1 = data1.replace('\n', '')
        myDocument.add_paragraph(data1)
        # 向文档里添加图片
        myDocument.add_picture(img_count, width=Inches(2), height=Inches(3))
        # 处理文字
        datas = [data2, data3, data4, data5, data6, data7, data8]
        datas = map(lambda text: text.replace('\n', ''), datas)
        for data_item in datas:
            myDocument.add_paragraph(u'%s' % data_item)
        #
        myDocument.add_paragraph()
        # 指数加1
        count += 1


# 图片计数
count = 1
# 第一次发送数据
dict_str = get_response()

# 判断cookie是否失效
login = dict_str['errmsg']
if login == '请先登录':
    input('cookie已失效,请重新获取登录后的cookie进行替换,本程序自动结束!')
    sys.exit()

# 取最大页数
page_count = dict_str['data']['pageinfo']['pagecount']
print('约%s页' % page_count)

# 获取开始页数
flag1 = True
mincount = 1
while flag1:
    min_page = input('请输入要开始获取的页数,默认值为第1页:')
    if min_page.isdigit():
        mincount = int(min_page)
        flag1 = False
    elif min_page == '':
        flag1 = False
    else:
        print('非法参数!请重新输入')

# 获取最大页数
flag2 = True
while flag2:
    max_page = input('请输入要获取的总页数,默认值为最大页数:')
    if max_page.isdigit():
        page_count = int(max_page)
        flag2 = False
    elif max_page == '':
        flag2 = False
    else:
        print('非法参数!请重新输入')

# 获取当前工作目录
root = os.getcwd()
# 拼接路径
pt = os.path.join(root, keyword)
# 如果目录不存在则创建文件夹
if not os.path.isdir(pt):
    os.mkdir(root + '\\%s' % keyword)

# 创建空白文档,并设置样式
myDocument = Document()
myDocument.styles['Normal'].font.name = u'微软雅黑'
myDocument.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')

# 创建空白文件,并设置编码
f1 = open('%s.txt' % keyword, 'w', encoding='utf-8')

# 获取数据
for page in range(mincount, page_count + 1):
    print('第%s页书籍信息:' % page)
    # 发送请求
    dict_str = get_response(page)
    # 如果为空则结束发送
    if not dict_str['data']['list']:
        break

    # 把数据写入文件
    data_download(dict_str)
    # 提示信息
    print('【第%s页数据写入文件中...】' % page)
    # 延迟发送请求
    time.sleep(5)
    #

# 保存文件并关闭
f1.close()
myDocument.save('%s.doc' % keyword)
print('数据写入完毕!本程序自动结束!')

本帖被以下淘专辑推荐: · python应用|主题: 27, 订阅: 15

版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7996.html

搜索