找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 2134|回复: 0

Python + pyspider某小说站的爬虫,入数据库,火车头发布,资...

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
$ n& ^7 Q9 X; `5 T6 Y7 F& b' Z$ l& K
  1. #!/usr/bin/env python) t0 s0 _8 t! X4 B; I" C# a/ g
  2. # -*- encoding: utf-8 -*-
    1 `8 u7 R) c. [. Y$ T
  3. # Created on 2019-05-05 21:43:111 y) G% L  f" p& _# t5 ^
  4. # Project: XiaoShuo6 l' n0 c2 \! F0 V2 K- E, k$ a
  5. 1 l9 x2 P: Q3 D; i
  6. from pyspider.libs.base_handler import *# }: ?( {: v) d" w! B
  7. import pymysql
    8 z( F% r# i0 Q0 B4 |0 C1 v
  8. import random1 a  g: X7 W  C& D7 A3 z
  9. import datetime7 Y* O% C/ a/ {: t4 I& }( z  r2 j
  10. import urllib2,HTMLParser,re
    & ~3 I$ h0 k! `6 L- q* {  h
  11. import os
    + X/ H9 {! b! u6 [
  12. import sys3 A0 R/ \& G% h& j9 w5 B2 d9 C
  13. import re9 Z7 h+ a8 Z  j1 {; x  ^
  14. import codecs
    3 o) m+ w0 H9 B( p4 B
  15. import requests
    / Y% U5 T6 e7 b- I3 U
  16. import json2 s  x% s; R8 J5 Y. U

  17. ! P9 Q- ^, L- D: }) N
  18. class Handler(BaseHandler):
    # }- }% D' Q! j1 m* E4 E
  19.     global Datos
    1 ]& h# G# A$ e2 ~
  20.     global P_dir   
    0 ?% J/ U% D5 {
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径" C( m9 c% a' O  n' P* S1 O
  22.     global Datos- @  d  U. `3 m: e# o) i1 P1 S
  23.     Datos = {}3 V" ?1 O3 c. Y  t
  24.     headers= {  F5 I" m  @8 }9 X- w; I
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',/ r% {1 W/ g4 i' ?
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    ; h0 l; Q6 H. p1 R/ }2 N  a' {
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    1 ^8 A, ]( `6 d. @5 y" g
  28.     'Cache-Control':'max-age=0'," @3 o, n1 N  q2 e3 s2 y8 t& v8 D
  29.     'Connection':'keep-alive',, G  {4 w0 J& F) v5 |  ^4 P
  30.     'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'
    3 [. z1 \' {+ r; F& w( M
  31.     }7 A/ M! E- W. |
  32.     crawl_config = {
    0 v- \  U9 r0 K. ~) N) N1 j" p
  33.         'headers' : headers,: \0 I+ }( J! p9 L) x
  34.         'timeout' : 300( ?( d" _' b* }8 h
  35.     }5 h4 h2 V3 M+ ?% E
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    # S1 @$ N" Z1 \
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    * a% @' @! V( C  S# m& n
  38.         try:* W0 y6 ^9 r  o0 M
  39.             cursor = db.cursor()
      n" b- @% \2 P6 u" t: ^8 b
  40.             #注意此处字符串的占位符要加双引号"%s"
    ) I& N( t) p4 z/ c& {- [
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);* W+ c: C1 G2 ~2 n0 o
  42. #            print(sql)
    $ [- {6 v) y: S  g
  43.             cursor.execute(sql)
    , f9 Y# h; I4 ]
  44.             
    5 _2 R1 f, B7 a( ]: _3 V; Y
  45.             #qid = cursor.lastrowid: r8 U5 ?; A3 j* U8 j) `' w9 f
  46.             #print(qid)4 w# `" e9 H( U$ v* ~, p7 X
  47.             - `& I# l- x* d
  48.             db.commit()
    . f! K2 T3 U- v0 w; `. J! |
  49.         except Exception as err:
    * j+ a# W; U/ X8 z; q8 z
  50.             print("Error %s for execute sql: %s" % (err, sql)): Z' u$ G; V/ `; D
  51.             db.rollback()
    & c" I# h; C9 a: C
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    , i" J4 ~& a( A% `: \; g6 P
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")- O; o8 |$ x/ t+ I' l( c( k
  54.         try:1 Z0 w1 N( Z6 F& B0 t4 U
  55.             cursor = db.cursor(), U, S2 E7 ]/ m! J
  56.             #注意此处字符串的占位符要加双引号"%s"2 ^* s2 L# m' [
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);3 f& B2 p% Y% d/ x1 h
  58. #            print(sql)1 Q5 y% _2 b: m
  59.             cursor.execute(sql)0 k" u, a' F# c6 s
  60.             ' x# P; X" U  @
  61.             #qid = cursor.lastrowid
    ! I- S' H8 j  h  o7 _
  62.             #print(qid)
    1 M, g5 Z% y& ^" s& n4 L  W
  63.             4 V5 X( q: @+ r& I% t+ ]
  64.             db.commit()
    $ Y- ]* k7 t( j3 X6 F( ^4 M* J
  65.         except Exception as err:4 B8 x( B/ X9 b% _0 S  b- I
  66.             print("Error %s for execute sql: %s" % (err, sql))- K7 _! n% J( x' N
  67.             db.rollback()- x, ]- b- Y6 w4 |$ k" w+ o/ z
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
    7 H9 f3 w8 g6 N' H* Q+ V" D! R
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    # v$ k' N- U3 ]- w" a* K$ D/ e1 h
  70.         try:8 F0 V* V0 i( t4 C, o9 y
  71.             cursor = db.cursor()/ \8 v7 _' {. n$ A9 F
  72.             #注意此处字符串的占位符要加双引号"%s", P" V% o3 P" S
  73.             sql = ' INSERT INTO BookConte (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date) VALUES("%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s","%s")' % (Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date);
    ' Q( X' E! k. L
  74.             print(sql)
    # u3 b5 G0 [( S0 n* O3 T& `1 C
  75.             cursor.execute(sql); C) R1 J9 o% B* V2 l3 i
  76.             print(cursor.lastrowid)
    - T+ Z  C- J0 `5 F6 p) U2 i
  77.             db.commit()
    : |- C- G' b7 x+ @0 Q
  78.         except Exception as err:
    + m7 g8 ^0 w; _' c3 S6 L
  79. #        except:
    6 p8 d% u+ ?0 m0 n' ~. u& L
  80. #            print('Failed')' B( m) u0 Y0 y: Z% Z) Q1 t
  81.             print("Error %s for execute sql: %s" % (err, sql))
    ( V! e& v) Y  R( [5 x- A3 C5 ^
  82.             db.rollback()
    , ]: M! l; l9 k4 J* G, S- l. \0 I& D
  83.         
    7 l$ J8 b: }8 R9 e0 |: ^1 n/ ~  o
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): " r+ i/ ~* z1 ^2 Y0 n) N, [! a
  85.             reload(sys)+ t# W% t  q2 w5 }
  86.             sys.setdefaultencoding("gbk")3 V" |- }% A0 g
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址2 D, Q, m9 R' z$ B
  88.             locoy_data = {
    . d9 P8 q6 O, N. l4 u' j1 v
  89.             'my_u':'用户名',   #后台用户名1 g+ x; q+ }9 h: O5 B4 I3 U0 [6 P
  90.             'my_p':'密码',   #后台密码
    4 o4 B' C$ n0 F' @. ~- l- R# @
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),: G( ]) L! P* s& Z! f: _
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),9 \! j4 ~: s6 N% \
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),; @; k' o5 f$ n( M: f- y
  94.             'article':BookConte.encode('gbk', 'ignore'),
    - V+ W! k$ t6 ]
  95.             'author':Book_author.encode('gbk', 'ignore'),7 ?! w$ b, [3 V4 v
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),4 v3 H$ q" V$ ]& P2 r+ l9 d
  97.             'thumb':Book_img,
    # g' [" u! a. g
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    ) }  R7 g! g4 Z% _
  99.             'abover':abover.encode('gbk', 'ignore')           ; A; r8 W/ x2 `& }0 z  g7 |6 t/ [
  100.                 }0 K; Z; G7 c8 t
  101.             res = requests.post(locoy_url, data=locoy_data)
    ; t+ b( k8 x; Y; _8 W+ g8 z. n
  102.             print res.text: e  I2 Y3 Z! T. U  s
  103.             print res.content
    * P) Z3 ]* Z- r, \
  104. #            print Dsd
    " |; R) g* [+ l+ f4 {# R! {
  105.             return res
    + s" f7 z! U* N3 K" o
  106.    
      X, O( T7 K& C. ]
  107.     def __init__(self):4 K- z$ _+ W, O, Q" C. f& Z  l8 E
  108.         self.base_url1 = 'https://www.****.cc/': L4 w) G1 Q5 s- Y
  109.         self.base_url2 = '/'
    ' C! r. J: ^2 F" J) g
  110.         self.CaterId = []7 y$ }0 h. R( g% I0 q1 R
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng'], \& u6 l4 t* o7 k/ ~9 G
  112.         self.page_num = 19 V* ~- a0 Z, o: G8 E' t( r
  113.         self.total_num = 200   # u7 O1 D8 ]" `! B' z, a$ E4 t

  114. + [5 z! W4 L- Y) m
  115.     @every(minutes=8 * 60)6 s0 R8 d  I3 o
  116.     def on_start(self):2 e& G0 n# J8 [8 j" b' x2 K
  117.         global Cater_Name
    - U( u3 |* f$ z
  118.         Cater_Name = []* x: }4 R! g) z# T3 {! X
  119.         while self.page_num <= self.total_num:
    ) t6 m8 @7 X5 }" S5 G0 y
  120.             for self.CaterId in self.CaterIds:/ C; |6 m" C  _4 w& Q, i0 T
  121.                 if self.CaterId  == 'xuanhuan':% e: V9 i: }' D1 e
  122.                      Cater_Name = '玄幻'
    , Y; H3 s. X! ?; @/ C1 y, z
  123.                 if self.CaterId  == 'wuxia':
    9 Q0 F$ v8 ^) G! w
  124.                     Cater_Name = '武侠', T8 F' P1 g5 M' ~7 E
  125.                 if self.CaterId  == 'lishi':
    5 x9 F6 D) K7 m$ ?
  126.                     Cater_Name = '历史'            
    1 n3 c9 w7 Y. N  n; V
  127.                 if self.CaterId  == 'yanqing':
    $ W: c8 N7 I9 D
  128.                     Cater_Name = '都市' : m% v2 [, o" E3 b6 m8 |
  129.                 if self.CaterId  == 'nvsheng':
    # w$ @  V* r3 X5 S2 f6 G1 e0 J+ t: e
  130.                     Cater_Name = '都市'
    . u9 m* I' j$ L8 N% C% D0 {  d/ t
  131.                 if self.CaterId  == 'kehuan':5 V: Y' g# `* H
  132.                     Cater_Name = '科幻' * K5 z( a( p9 q: v' y8 f
  133.                 if self.CaterId  == 'kongbu':# B0 t1 H1 B( M2 j! P
  134.                     Cater_Name = '游戏' 2 E+ N& o' e" b* O6 D% h/ B
  135.                 print self.CaterId  p+ s9 T7 v, Z4 Y" b
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          / R. r; M8 g3 \, \, `
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    $ \! ^) v& [! Y" l/ [' t
  138.             self.page_num += 1
    7 D5 `  l1 Q7 `& B6 S% Z
  139.             9 ]$ X& w# w7 I1 |8 D/ L
  140.     def list_Caterg(self, response):
    ' Z$ ^* h' C. t5 t- _
  141.         Cater_Name = response.save: _, I5 U9 H, R. {7 G
  142.         for each in response.doc('.pic-list a[href^="http"]').items():$ d  G: ^& S# ?1 l  ^% l! I9 p- ~
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
      n9 w' a- l1 P) K) D0 G& T; ]; u' w
  144.             3 A4 U# p6 O5 W% Q* m+ i2 f
  145.     def list_Caterg_detail(self, response):
    : K7 c/ \! k3 D$ A  t
  146.         Cater_Name = response.save; S% i4 e$ z% j' E
  147. #        print Cater_Name
    * a7 {" C1 N- ]- }) c
  148.         Bookname = response.doc('h1').text()
    4 C  s- b9 O* w
  149.         print Bookname
    2 B# Y* v  V$ r( h1 g; @
  150.         Book_author = response.doc('.authorname > a').text()" [$ o) r- ~6 e$ E+ R( F& ^9 N5 J  z4 J
  151. #        print Book_author: u0 P4 N( i; D
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    - i1 F. |' ]1 o& |8 u. ?  a' [
  153. #        print Book_Introduction
    # c% N6 D/ X4 w, I
  154.         Book_Synopsis = response.doc('b').eq(1).text()* b; W- k' h( \
  155. #        print Book_Synopsis4 M9 {3 e, L5 G  L9 c1 B6 L0 q& a
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]2 j1 U. l" {1 L
  157. #        print Book_Palabras
    8 V( [' X7 w4 ]
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID8 R: d- q9 v: r+ D
  159. #        print BookIDs
    - H/ w; o/ }% [2 X* Y$ O- [
  160.         Book_Dates = str(datetime.datetime.now())         
    3 g2 M$ ^  g* P) D
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():* M. e9 \: W0 l$ m7 x# l9 j
  162.             img = imgs.attr.src' Z& \' S5 w+ @
  163.             print img
    % S! ?  K3 m3 G! ^0 d
  164.                 #小说封面下载2 O! ~* l6 U  G+ z! O
  165.             extension = self.getExtension(img)
    , L/ A3 ~. s7 h+ p2 U/ g( \3 |
  166.             name = self.getname(img)
    ) N) k( N. _, S
  167.             file_name = name + "." + extension2 \( [) L! V' W1 w& }
  168.             imgDir = P_dir + name
    - c6 ?/ N: i# e7 R9 x
  169.             Locaimg = imgDir + "/" + file_name. p6 m" x3 N/ s# A" B  }1 R; h
  170.             print Locaimg
    - b' A; j+ |( s
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地* y# O" }2 j5 C6 u% w
  172.                 print('attachment url is ' + img)               #2 b* z, p. _( N# ~! z8 f
  173.             Datos = {
    ' |! z# y) I, o( F. f- f- f7 }
  174.                     "Cater_Name":Cater_Name,- u: c# O3 [& z$ ]' V
  175.                     "Book_author":Book_author,
    ! l2 E& {7 Q" z8 `
  176.                     "Book_Introduction":Book_Introduction,
    % Y) r7 r9 a' ~0 z; T8 I
  177.                     "Book_Synopsis":Book_Synopsis,; s& i- d* I# J' k
  178.                     "Book_Palabras":Book_Palabras,, H8 y/ R6 t) V) w
  179.                     "img":img,9 o" e7 F6 D' H1 E; A
  180.                 }
    7 g: _# E6 e# C8 q" V
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    2 r/ N% ]0 g- _$ n8 Y
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    % p; h# d3 u: l, v
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)1 k1 C4 C, n- Y& A. q9 B
  184.             
    1 r5 T# b  C% y" i" T! h$ o
  185.     @config(age=8 * 60 * 60)    # \7 `$ @) w/ U; U
  186.     def index_page(self, response):
    ' F* E% t0 x+ g( B) k( N$ z! \  R
  187.         Datos = {
    8 V% n* j! z1 _0 F( b% }
  188.                   "Cater_Name":response.save['Cater_Name'],
    . X5 v' k; a8 x3 K9 n  M
  189.                    "Book_author":response.save['Book_author'],
    1 K- r" @7 B3 `8 F# U. p4 m7 w* K
  190.                    "Book_Introduction":response.save['Book_Introduction'],3 {+ s  h- Q+ h1 K! Q8 p( V3 l6 R
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    , l6 j4 g9 V5 l9 X- w8 X: z* q% p! A2 q  c
  192.                    "Book_Palabras":response.save['Book_Palabras'],; x1 w( O% r4 R: S. d
  193.                    "img":response.save['img'],4 x! C! z2 E& Y% r9 }: Y8 r& u
  194.                      }
    2 q, A  a1 Q3 S5 ~
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    9 F) V# ?, u3 O1 }% ^
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    1 i' ]8 h6 W+ z! c9 Y
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    2 r; }& {+ j# j# O
  198.     @config(priority=2)
    3 O; Q& A8 k: g9 n
  199.     @catch_status_code_error" p' c1 B7 i5 |6 E3 N, }; g
  200.     def detail_page(self, response):        1 ?5 u/ s; ^& r4 O0 j
  201.         NewRe1 = u'哈书'$ q$ b# n! Q$ L6 H
  202.         NewRe2 = u'huhjsd.CC'
    ; f: _6 t, v; [6 ~& o3 Q
  203.         NewRe3 = r'^\\n\\n'& l! q) ]  }! F6 F3 M
  204.         NewRe5 = u'小说网'* _9 k" f8 N# i
  205.         NewRe6 = u'fgdfgf'
    4 o# \) G/ b. r: x. t$ N/ y8 n# b: Q
  206.         NewRe7 = u'fgfgf'% b; }9 B( c/ N: O0 A: f' x0 g
  207.         NewRe8 = u'ffhgf'
    # [; P8 V8 _) q* f
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    ' u- A+ @  t4 g5 K
  209.         ReC1 = u'静思'
    3 T* F- c) n5 K
  210.         ReC2 = u'aghgf.com'
    0 D% s2 r0 J/ H; i! v% H8 a
  211.         ReC3 = u'aghgfh.com'
    ) ^5 ^0 |* |5 ~
  212.         ReC4 = u'') K9 C3 ?& q2 T( T$ y0 `, X# V
  213.         ReC5 = u'文学网'' G" K3 @/ Z) L! o- j( p/ F) F6 u
  214.         ReC6 = r'<BR>'( E. B1 s8 E$ x- `% D
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称% E7 {. [4 Y7 `9 P4 E
  216.         print Bookname
    ( q0 |. E  j# H: X4 t
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    3 R& u3 Z" @* u; f
  218.         Book_author = response.save['Book_author']   #小说作者
    7 t* u2 N9 i8 B
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介2 f5 F5 d' z1 z7 ?
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新4 P. o5 E: L, n3 e6 T4 \
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数! w( q& l' \% ~
  222.         Bookurl = response.url   #小说网址* y0 V9 M5 L- T& [" w. N
  223.         Booktitle = response.doc('.article-title').text()   #章节名称$ z) Y; L8 b# s3 E9 X- [# E2 N
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    9 s7 q& F! H$ z8 E& U
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容7 K2 {4 Z! q0 E5 w! F
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    : Q* [4 b( B7 c' V/ W
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    $ n5 f/ R. s) q9 s
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    1 a* n% p) a1 w9 d& f8 g% p
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)  t3 z9 V3 O3 Q; c
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    $ D/ R* j+ b8 g$ E# m% x
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    4 g  \, h* k$ Y  i
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)' U0 B$ L  T( h# S$ F$ `
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)1 G: K5 N) f' b' s& U
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    $ R2 Z+ o  E, f( t) X, b
  235.         BookConte = BookConte4.replace("\n\n","<br>")
      ~3 t8 e. y+ H( a; D% O* I4 Q
  236.         print BookConte8 l  Q9 K  V: j) `/ _0 _2 O- x9 a
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    7 Q: S* h9 _& b6 T
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    . s$ J0 Z9 u, N$ Y0 n5 @1 n7 P
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)9 o$ @4 t) Y% n' v
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)8 C- o" d1 n+ d! [9 {( T0 w8 ~6 r
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]       |0 Z! a3 V! T
  242.         Book_img = response.save['img'],  #小说图片
    . V; H9 r( H; t
  243.              + {4 W" d1 T% m( f$ B
  244.         #insert into MySQL 小说入库' h( y. p. M" `1 a% d, j
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布+ F* p# ~( l! z2 s4 {$ y  c
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    1 V$ ]' x8 \6 n3 {1 j
  247.         #post提交发布
    6 H' \- ~$ y. y, r0 E& ?$ w" c
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    % h: c7 G: m( q' P! ]" \
  249.         Datos = {9 n% U( B. S$ w7 G
  250.                   "Cater_Name":response.save['Cater_Name'],
    : ~% A1 \! O& T6 B8 u
  251.                    "Book_author":response.save['Book_author'],- O: ], C4 C( X' ~$ O
  252.                    "Book_Introduction":response.save['Book_Introduction'],, m- k5 u  h2 c- R
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    8 g# V  A; ~9 I( g9 v+ H; P
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    2 n5 V, p5 o; B0 g7 `! ?. A4 b( C" g
  255.                    "img":response.save['img'],' o  I, R$ T. q4 _7 L2 T
  256.                      }
    - Z( S) j6 t& ?1 T+ G  D
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():; k, S6 V: l3 v4 N* N* m" h6 W
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    . P$ D% B: E% }1 t( j: q& l
  259.         return {# _  m% i8 C  U% `' u: Z
  260.             "Cater_Name":Cater_Name,
    6 F4 `9 z8 n! B/ g3 n
  261.             "Bookname":Bookname,1 Q* S  Y$ [4 j; S
  262.             "Book_author":Book_author,. h) b" P/ q( {! V2 b/ y  f0 h
  263.             "Book_Introduction":Book_Introduction,! ?$ y. e: Z: G7 I+ {  b
  264.             "Book_Synopsis":Book_Synopsis,3 ^9 D4 U9 z2 T" ?
  265.             "Book_Palabras":Book_Palabras,9 a. A8 d5 `' G+ i' w
  266.             "Book_img":Book_img,
    4 A- t; R- z8 K' |4 ?$ j
  267.             "Bookurl": response.url,$ \6 l4 [! T* \! F' o, D2 x
  268.             "Booktitle": Booktitle,
    6 o0 A8 K& }4 S2 T% }# B
  269.             "BookID": BookID,# a* e2 E( u/ |; ~( j
  270.             "BookConte": BookConte,
    & m. T* [" ~: G
  271.             "Titleid": Titleid,
    , o7 J$ z' V- r: ~4 E! l6 C  w+ ?
  272.             "abover":abover,
    + o" ^! N6 Y  o; \
  273. #            "Book_Date" = str(datetime.datetime.now()),
    / c7 K2 F0 C* |9 |
  274.         }& D# Z$ K) M; q# G* ~; S$ }
  275.     def download(self, P_dir, imgDir, file_name, Book_img):3 M$ p8 s1 F7 X
  276.         if not os.path.exists(imgDir): 2 |# l* G& K# B7 r) ~. {
  277.             os.makedirs(imgDir)
    1 Z& H- ~6 X/ H8 U, f
  278.         file = imgDir + "/" + file_name  D6 y2 S4 v$ l7 t. }; ^$ _/ F
  279. #        print file
    * U/ f8 c- C- d  @' g
  280.         f = open(file, 'wb+'). Z5 }7 l$ u$ S8 h& _
  281.         imag = requests.get(Book_img)
    , u( E8 e) a3 Y( {5 Y4 P* d( h
  282.         f.write(imag.content)$ J0 X/ |+ H4 P: [6 |% u5 ^3 l0 x
  283.         f.close()
    ; w9 J0 \6 j) A5 D9 y! J
  284.         #保存图片前
    9 q* u: u  p: X  L% S
  285.     def save_imgs(self,response):% C8 Z( X6 v0 w* y' i* l* H- U3 k1 E
  286.         content = response.content* P3 U# G$ s% g0 V. F
  287.         file_name = response.save["file_name"]
    2 O6 n' n! V& n7 l
  288.         imgDir = response.save["imgDir"]
    8 m8 [6 F2 z* V( v1 \! V/ I
  289.         file_path = imgDir + file_name
    ( e" G* g# i+ W" I  v- X6 Q  j
  290.         self.save_img(content,imgDir,file_path)5 p) \. q( X3 x( O
  291.     #保存图片
    5 B4 A  D7 g7 ~1 H+ x6 [+ A8 _
  292.     def save_img(self,content,imgDir,path):4 |6 X8 o) E" z/ S0 M) u2 i6 W; a
  293.         if not os.path.exists(imgDir):                         : B$ s1 r8 H% X2 g$ g
  294.             os.makedirs(imgDir)
    9 r3 T* s$ r. g2 d
  295.         f = open(path,"wb" )  \& j2 F" I( Y1 `, l5 S- I; k
  296.         f.write(content)" `$ x. I* P2 \# |" N
  297.         f.close()
    $ \/ [) [7 H1 n0 E; n4 x& D$ R
  298.     #获取url后缀名
    2 @1 ?' Q( {2 x4 Y* B
  299.     def getExtension(self,url):                            5 y" B8 c. p. z' Y' o5 f
  300.         extension = url.split(".")[-1]
    2 p: g: R) @* g( y# o
  301.         return extension
    / X2 [8 K: U" V
  302.    
    ! c& w: n. w' ]3 O
  303.     #获取图片名3 [" p  o1 ~" [6 ?" F$ n
  304.     def getname(self,url):
    1 \2 C9 `% \0 f; ^! k: F
  305.         name=url.split("/")[-1].split(".")[0]$ {  X% X0 j$ o8 D
  306.         return name
复制代码

% s! p. R9 _- }& g' O+ B: B
7 M% E$ T0 p& ?8 {$ C- M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|中国飞逸网

GMT+8, 2026-8-30 20:48

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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