找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
, l5 c% r6 W$ _' Q4 T8 I
  1. #!/usr/bin/env python6 s( V. V( a1 o. F: E
  2. # -*- encoding: utf-8 -*-; Q9 T! k, \2 S
  3. # Created on 2019-05-05 21:43:11
    ' y8 o! V) k9 k! a9 n
  4. # Project: XiaoShuo
    " l) ~9 l6 S. {0 ~) I: n$ {

  5. 1 d$ K8 O1 I& c/ `$ z, X9 r
  6. from pyspider.libs.base_handler import *
    6 W" s, Z/ e" ^6 S& `
  7. import pymysql
    ( N# N  X! p9 B% m) {% n
  8. import random
    ! e8 \' E2 r: m0 L
  9. import datetime5 b) \; y$ P, e9 S& G4 d/ z
  10. import urllib2,HTMLParser,re% k3 q  Q6 J6 q. R
  11. import os
    ) C6 R8 \* P8 \$ F' M9 }
  12. import sys
    0 t- d2 x" g2 a5 b
  13. import re
    % R( Q4 V( v1 i/ E  ^- Q4 Y6 ]
  14. import codecs
    " s: y6 p/ d$ V/ n4 d8 w" N$ E
  15. import requests
    3 k: O6 F8 y6 d' x' G
  16. import json8 `0 C& ?; j, V% ]4 P5 X

  17. ) ]. z2 J; s3 W) t" w
  18. class Handler(BaseHandler):- Z% F0 `$ t" Z- z& M
  19.     global Datos( N4 a5 |$ S. V( L3 Z
  20.     global P_dir    8 `0 B# M# c+ Z
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径4 F  E: U/ Q  Z2 e
  22.     global Datos* R, V) g" x: q4 H( s
  23.     Datos = {}
    ) X' V6 b$ A9 X% Z' @
  24.     headers= {
    ' q; J6 W  ]6 _6 P% t6 n+ z# l( n
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    . Z, }* u6 d7 U6 ~. V
  26.     'Accept-Encoding':'gzip, deflate, sdch',4 n5 ~6 ?$ q+ g6 B# w3 a3 k: l
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    + P$ G( O; \, n1 a# N; _
  28.     'Cache-Control':'max-age=0',
    2 H& p! W0 `+ Y" z# _! ^; o, z
  29.     'Connection':'keep-alive',
    ' b& A$ q3 a/ Q6 C9 e& ~5 Z( K
  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'
    ( N8 Z# `" [- {! }3 k
  31.     }9 ^5 t2 y, {+ c  b  j2 h- P* t2 W
  32.     crawl_config = {
    0 Q( K7 D; V; a9 M) Q3 O
  33.         'headers' : headers,+ k3 h: M0 Q$ s  s% K9 w4 ?, W
  34.         'timeout' : 3007 }0 d8 J" k. z4 W
  35.     }
    1 ~1 i9 Z/ [2 s. Z7 ?% a
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):$ t- T- w- j% P$ ?
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
      }+ t( U3 Z7 V6 g% i; F" i
  38.         try:% x  m5 t/ x: k* u* t3 l
  39.             cursor = db.cursor()
    ; H! q+ x& K3 Z7 P
  40.             #注意此处字符串的占位符要加双引号"%s"
    + C& P4 @& ?( l3 Z! Y: f# D0 y
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);. |* [& }- M2 X% J
  42. #            print(sql)3 B# j% l, y; u
  43.             cursor.execute(sql)% }1 z( q% D4 C$ Y' l5 R) Y- P
  44.             
    3 p$ z: L1 a  [
  45.             #qid = cursor.lastrowid+ L5 {+ g6 G9 H" C
  46.             #print(qid)
    ( p, i9 S" |2 j0 g' k- T% U; N8 `
  47.             
    ( y, Z* D, S1 ^
  48.             db.commit()
    * u, o. J0 J$ b1 n
  49.         except Exception as err:/ w# i0 Q4 _. u" |7 C
  50.             print("Error %s for execute sql: %s" % (err, sql))+ q+ w: {  k; ?7 E( N2 z0 v
  51.             db.rollback()
    / V0 {# }! r0 G" Z5 x4 j1 k
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):: P, R& W" `. Y6 Z, V" A6 X
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    6 w% e2 ^2 U, B  y" o
  54.         try:
    & y# a; W6 Y. I; f" P6 J8 O  i
  55.             cursor = db.cursor()
    ' @0 b- _6 q5 r% _
  56.             #注意此处字符串的占位符要加双引号"%s"& W7 D" K5 U; W
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);- {  [2 j" O4 ]( E5 n
  58. #            print(sql)
    0 l" a) w8 g4 a. c8 D" w. [
  59.             cursor.execute(sql)
    / a) ]0 g* }# d8 f) m& t7 l$ B( I' c
  60.               u8 j/ n; I8 I, |
  61.             #qid = cursor.lastrowid1 {2 j! J& J  X  v. f. P8 s' ^! x
  62.             #print(qid)
    : B6 O) V8 O4 Y8 z4 h9 {
  63.             
    & u6 v: b* G4 w% Q
  64.             db.commit()
    ( V3 Y' G$ g! c, [4 U/ e5 ^
  65.         except Exception as err:: C" a- m& b+ x/ O
  66.             print("Error %s for execute sql: %s" % (err, sql)); ^' B* F, z' E: @' Q
  67.             db.rollback()# V% u6 V1 S" E6 P: K, }7 p2 A
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
    9 L8 I2 Z- E- G; Q
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ( ], X2 ^/ Y  w- o* n
  70.         try:
    ! @8 ?0 |; F: @% |( l
  71.             cursor = db.cursor()
    ) Y/ e# G) N, R7 M& L; G1 y  s  e" \( B( r
  72.             #注意此处字符串的占位符要加双引号"%s"
    1 p0 j- \3 r% u( s/ o' w
  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);
    2 k. _7 f4 b) H3 A- o" F: o4 Y3 p! X
  74.             print(sql)
    0 S& M+ h% b) V8 G( z8 W9 Y* t; ^* Y7 j
  75.             cursor.execute(sql). @8 y- T6 n" S8 Z; [
  76.             print(cursor.lastrowid)4 E1 P$ S% ^3 R
  77.             db.commit()
    6 u) z# i* R/ C2 |" k1 w
  78.         except Exception as err:+ b7 D. j, l2 Z) l5 e
  79. #        except:
    5 r8 ^0 g' F* R+ C5 Z
  80. #            print('Failed')* J$ j& ~3 X% R
  81.             print("Error %s for execute sql: %s" % (err, sql))1 m4 w8 ^( X5 t) ~
  82.             db.rollback()/ L7 S1 ]' ?0 z! j6 ^
  83.         
    ; i3 U. Q  g: F: S( q' G
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    ) G! ?/ Q/ A: M7 N. Y% R: i
  85.             reload(sys); K2 o4 s" u6 d- d  y
  86.             sys.setdefaultencoding("gbk")% ^# g( y, a0 h. {* P, D
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    + w6 L8 X4 l, U0 V5 P/ D
  88.             locoy_data = {
    ! [3 C2 j% O& K; ^* o6 e
  89.             'my_u':'用户名',   #后台用户名# w. y9 ?% N  a! ?" a* l
  90.             'my_p':'密码',   #后台密码
    3 O# L+ ~% @* [- y7 N. f- e
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    # k* R9 T. S: T: U( {
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),( E2 q- N# h' K0 Z7 L
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
      M1 L# h$ n0 q! u( L6 `/ ]
  94.             'article':BookConte.encode('gbk', 'ignore'),
    ' h0 J8 h& x! N+ `" w
  95.             'author':Book_author.encode('gbk', 'ignore'),
    0 [5 d' y9 p* N  E" q1 \
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),8 n8 X/ N; t9 W  L: q" H6 i
  97.             'thumb':Book_img,
    2 z, J, Q1 L7 w" J" U
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),8 q4 r" J9 y0 |
  99.             'abover':abover.encode('gbk', 'ignore')           
    + n5 m3 R4 c+ S5 k8 N- \- C
  100.                 }
    # q" U7 Y9 @3 E) o3 X8 F( E
  101.             res = requests.post(locoy_url, data=locoy_data)$ b; \, T# w1 d( x7 D, U2 W) \
  102.             print res.text& q1 U2 O( H7 I. a: }
  103.             print res.content
    0 q% P+ m- {: z, D( @1 E
  104. #            print Dsd# J* V% a& I& `' P
  105.             return res
      R& G2 M6 M1 U( I% T
  106.    
    # ~+ k7 U" i2 r# u) I$ Z2 X
  107.     def __init__(self):9 L* ^0 Q1 \- {1 Z
  108.         self.base_url1 = 'https://www.****.cc/'
    3 U" [+ d7 Z6 N) J6 _* ]
  109.         self.base_url2 = '/'/ a1 J# Z0 y  ]  {/ X' w' g% ?
  110.         self.CaterId = []
    6 c% M* ?/ {, p# Q! Y: W) f$ U
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    + O3 }; F. U: u  Z2 W$ n) V+ c0 }
  112.         self.page_num = 1
    9 o$ Y( C9 P3 ?' y, n
  113.         self.total_num = 200   . m9 F% \2 j3 ~' n' m

  114. 7 O6 x+ V4 k  ?6 W
  115.     @every(minutes=8 * 60)8 u2 X4 J/ B% F6 c  F/ o
  116.     def on_start(self):
    ; i0 B: X. f" Q* I& O9 ^
  117.         global Cater_Name
    1 k6 Z4 _$ Y3 {4 g$ u
  118.         Cater_Name = []
    3 Q# Q  _5 x) o+ c7 _% I( {8 G
  119.         while self.page_num <= self.total_num:
    ' g/ J/ [* Y& |2 `- ?6 Z( f
  120.             for self.CaterId in self.CaterIds:
    1 v, S' p7 x1 l" k, e1 `
  121.                 if self.CaterId  == 'xuanhuan':
    ' ^/ p- }3 n8 U" E3 f. d
  122.                      Cater_Name = '玄幻'
    # \% `. t0 I# a% C1 Q1 r6 H6 C. U
  123.                 if self.CaterId  == 'wuxia':
    ( T% c' O" K/ l# B1 N! I! W
  124.                     Cater_Name = '武侠'; r' }5 m5 t% r7 S  M) s* _
  125.                 if self.CaterId  == 'lishi':  B( @- I3 r8 e5 T+ a/ q
  126.                     Cater_Name = '历史'            " X2 o$ ^% J$ C) Y
  127.                 if self.CaterId  == 'yanqing':
    " \% X5 J7 }/ N, w1 s4 c
  128.                     Cater_Name = '都市' , o1 u8 \& V7 c
  129.                 if self.CaterId  == 'nvsheng':$ b, @$ z. T# L0 z( ~& V3 E
  130.                     Cater_Name = '都市' ! `! g" N2 q, M* ?
  131.                 if self.CaterId  == 'kehuan':
    ' @- N% V' R6 B
  132.                     Cater_Name = '科幻' / r5 Q6 b1 l2 n9 I$ h
  133.                 if self.CaterId  == 'kongbu':8 O9 j1 z: z$ d% `/ G9 C3 ^
  134.                     Cater_Name = '游戏'
    ' d. t9 I4 p8 G/ ?+ G
  135.                 print self.CaterId: a, ?. L( l' {. t2 J+ S% f/ W
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    & L7 `0 M& l, r1 c  f- m
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)% f0 |* M  p/ Z& P# @
  138.             self.page_num += 1 1 `6 P5 P: g+ S6 [$ Z2 U7 r/ w
  139.             1 I4 W1 m' B6 u5 p$ {
  140.     def list_Caterg(self, response):
    # g# a( P- [5 ?  D! b; c, ~/ T4 P3 x
  141.         Cater_Name = response.save
    . p, w: z- R8 X! ]  b2 s( W5 m+ a
  142.         for each in response.doc('.pic-list a[href^="http"]').items():0 b0 n5 @3 N- I% g& F( B) p# O7 n
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)" |" k+ C7 X, Q4 _
  144.             & `9 `: V$ D* o. N; `
  145.     def list_Caterg_detail(self, response):6 p* G# K0 e" Q
  146.         Cater_Name = response.save' f: L9 K2 w3 K9 N2 L: R7 r
  147. #        print Cater_Name
    % N/ a4 X3 S* A" I
  148.         Bookname = response.doc('h1').text()
    + @1 ?& n& }7 M
  149.         print Bookname( b# r8 B& h* C6 R% x; K7 h
  150.         Book_author = response.doc('.authorname > a').text()
    . n, ~5 _" Z% P" t/ V
  151. #        print Book_author
    ) p4 c8 }1 o( X6 x
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    " \4 p7 H- C8 ?) _# D; l4 `3 @
  153. #        print Book_Introduction, t! {- X) f" H% F' u# o. l
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    ' Q0 o! o7 R/ I6 c2 A5 A& e
  155. #        print Book_Synopsis
    1 ]. D8 I( O4 y6 e4 w( ^) O
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]6 Q* t! y" f  v8 D  r0 l* k7 H
  157. #        print Book_Palabras
    5 Y+ X1 G9 d( n& s3 V
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    7 M3 ^: S" X  B; R9 Z4 }7 j) _$ s; x
  159. #        print BookIDs
    $ v" @# m" ~& y) @5 Q
  160.         Book_Dates = str(datetime.datetime.now())         0 C: h) l; D2 Y1 d8 o
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    + \! @' b# r" o2 z. I
  162.             img = imgs.attr.src
    8 ^/ E  K9 W$ Q
  163.             print img
    & Y8 ^, {( y. ?  K- r9 A
  164.                 #小说封面下载, S4 g0 F; b+ _' z( z% Y
  165.             extension = self.getExtension(img). Z& e: k* ?1 r" q) f
  166.             name = self.getname(img)$ ^. L1 p, x/ {) k1 a
  167.             file_name = name + "." + extension
    . P7 S! \! q# I- e0 N  s
  168.             imgDir = P_dir + name6 v8 c8 `4 K3 h
  169.             Locaimg = imgDir + "/" + file_name4 Z, S) a: Y; N! H5 |
  170.             print Locaimg
    ) W- z0 \, D- z9 v- R# @
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    % i. X' ^% d  [* K: o2 @0 U
  172.                 print('attachment url is ' + img)               #
    - O0 r% O" w! H' V# F
  173.             Datos = {5 a- J. X- ~8 o+ C* _0 }0 ~
  174.                     "Cater_Name":Cater_Name,
    % \/ P' y5 Z7 k
  175.                     "Book_author":Book_author,
    : ?3 h  o5 L0 w9 ~
  176.                     "Book_Introduction":Book_Introduction,
    , Y! u7 b& ?- c% C: C
  177.                     "Book_Synopsis":Book_Synopsis,
    ; S% Q  ]* `. K1 j7 n* X* c, P) A* C
  178.                     "Book_Palabras":Book_Palabras,
    ) L, M; S3 o- U( o% p) l; ?
  179.                     "img":img,
    8 c; j3 Z, y7 j8 k  l  J& r4 m
  180.                 }% P5 T5 v2 X! V( I: ?
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布9 k% Q' ~2 @7 q
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    0 f! D' I* M6 D0 h
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    : j3 i* N1 R6 L2 b/ g
  184.             
    0 f- e9 b5 R& P. S
  185.     @config(age=8 * 60 * 60)   
    0 ^5 F- D. c& B. n9 F) l) R5 d
  186.     def index_page(self, response): * u  x  j1 R/ R+ }+ K# u# X& }
  187.         Datos = {
    & Q3 V) O  i" O+ t; P- g' `
  188.                   "Cater_Name":response.save['Cater_Name'],& T2 G+ D4 f: ~% u! Y' W$ o
  189.                    "Book_author":response.save['Book_author'],
    ! d, j- g8 C) o5 @* I& Q
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    ; |% B6 v& K1 z0 v9 Q& u
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
      ~% Y. t% e+ [5 E/ ~$ X
  192.                    "Book_Palabras":response.save['Book_Palabras'],+ S- U5 Z2 Y& b% }7 |( f& x+ o( T
  193.                    "img":response.save['img'],* k- x% g( b6 {# l! M. G
  194.                      }
    1 j- V. K/ v. U3 A3 r
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    6 a* J* m8 m5 I0 O
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  ! u3 |4 @3 I$ L, }2 F9 p+ w
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    2 h5 l8 l: r( s0 D/ G
  198.     @config(priority=2)8 l$ m% o' L% f& V0 m" V* ]
  199.     @catch_status_code_error
    3 I& |# E; d% z4 B5 D; K* H3 l
  200.     def detail_page(self, response):        
    " D4 G& v) @( s
  201.         NewRe1 = u'哈书', f% L2 V! h  J: C4 O4 j: P
  202.         NewRe2 = u'huhjsd.CC'9 M7 c: Y; a9 u- g! r% p
  203.         NewRe3 = r'^\\n\\n'2 |" a8 @, I0 j
  204.         NewRe5 = u'小说网'% Z5 b5 N6 ~  s* `; }; R
  205.         NewRe6 = u'fgdfgf'" n  z, J6 d0 ~; S. N
  206.         NewRe7 = u'fgfgf'
    : B5 C( a6 }  R8 ~# G
  207.         NewRe8 = u'ffhgf'6 y9 Z( z) K. i- @4 Z: G& {
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'1 {: O: q$ J# C2 h5 ?. A
  209.         ReC1 = u'静思'4 C3 ]: h# K( ~6 ^
  210.         ReC2 = u'aghgf.com'& h; R" {, z' G# H
  211.         ReC3 = u'aghgfh.com') k% f9 H1 C' m" l# G" L
  212.         ReC4 = u''
    # R, ]  w3 s4 P7 A, s% T: ]. d
  213.         ReC5 = u'文学网'
    4 P' r' U4 }7 f
  214.         ReC6 = r'<BR>'
    % S, a/ `/ e- }
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    % S) n+ q# G) {
  216.         print Bookname" i4 Z( s* x( e# Z& S
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类. C/ M( d9 i/ b# B( p
  218.         Book_author = response.save['Book_author']   #小说作者1 a- h' A$ r1 v. w% T8 c
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介: C! G0 K6 D- y6 j  r
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新% h: y# L- H. [/ c3 W. V. q; D
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    " N+ r8 |$ D* m9 d2 y3 a( \( _( ^
  222.         Bookurl = response.url   #小说网址6 c$ Q8 X% t# G- T& i8 x1 |0 _
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    ! K, q7 y; U( W. o* n* k: ]: f/ A
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    ( P! U+ o* p: H) v2 Q0 d8 Z3 Z
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    # w  K( W4 c* \4 k+ Q) X
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)1 ?. I% {. @: u' A
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间! s& _$ l- ?3 _3 S, Q# B
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    9 E3 w4 J" I6 T, h  P
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    ) W/ S' P5 w7 u2 s) A% ~
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    $ @8 h) U" @8 g% Q4 i
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    0 m  Q) v8 y3 R9 k
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    % L  k& y" s3 i- f  Q
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    8 ^. w7 ]+ ^) R
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    3 \+ H* j* [( ~4 k( }/ Z* r
  235.         BookConte = BookConte4.replace("\n\n","<br>")( V2 H6 O+ R" \# l
  236.         print BookConte
    2 v0 w6 c; [. Q( j6 R* C0 l
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)8 _4 ~! w9 I1 m9 k
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)( M9 G+ o- g2 A. U" W! Q( K
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    ' S% a  F$ @9 j9 _4 [4 g$ i$ N9 R
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)+ j9 L) \7 D  E/ Q
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    % `& C# h  o9 L4 K* }* Z
  242.         Book_img = response.save['img'],  #小说图片, O2 E% j2 ^  R- q! d9 S
  243.             
    ; I& P% O2 x( E; z: L" f5 o
  244.         #insert into MySQL 小说入库
    2 e# `9 \( D( g' Q2 w& s
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    * c, ]& e, b( R$ m9 c
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    * ^( y2 g6 }+ `+ m# E& h. b5 S
  247.         #post提交发布
    9 N* M) }' f3 y. z0 h
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    " c8 e) t1 k, c! o1 F% S/ b/ E
  249.         Datos = {3 W( @  E2 y* X3 x# N$ \, \# `
  250.                   "Cater_Name":response.save['Cater_Name'],
    4 g0 u) r  {/ {# b6 f2 q; p$ V/ q, X
  251.                    "Book_author":response.save['Book_author'],
    " a) F( {8 N  |6 p7 I7 y
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    : l( C; q4 W" |; L
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ; i5 l7 [3 @, Z/ m6 i
  254.                    "Book_Palabras":response.save['Book_Palabras'],- q' \0 R8 l/ I, I
  255.                    "img":response.save['img'],0 ~& c+ M( s% a6 d# B& h# y$ Y
  256.                      }
    ' b% J3 t  N; s) [/ a
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    ( H. p; D2 \) q' t: R% G' |
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    " l# q/ o- s( ~0 k) r
  259.         return {! k5 w3 ^5 [; C& ~
  260.             "Cater_Name":Cater_Name,& r3 u+ l  L9 |: B) W2 D
  261.             "Bookname":Bookname,
    ) j2 h, @7 ?: }0 s! \7 B
  262.             "Book_author":Book_author,' l9 X# E, U7 D* M" ]
  263.             "Book_Introduction":Book_Introduction,2 k5 l! f6 L4 u* o9 N" C
  264.             "Book_Synopsis":Book_Synopsis,
    # l$ A, `; N" R8 c7 O' N
  265.             "Book_Palabras":Book_Palabras,
    $ D/ }% a2 K1 A) B
  266.             "Book_img":Book_img,
    ; Q( c/ H) m. w3 b+ V3 D  z" ]. ^
  267.             "Bookurl": response.url,
    ' s, \% c, k0 C( Y3 H/ b
  268.             "Booktitle": Booktitle,3 S! u$ r* @+ ^
  269.             "BookID": BookID,$ q3 V+ E* x( x. w7 n# t2 B" @
  270.             "BookConte": BookConte,2 c* X, K2 [7 q0 E* ^, \+ r
  271.             "Titleid": Titleid," q/ u5 ]6 |  ~/ U. R3 d: n
  272.             "abover":abover,
    7 u' Y* o6 ]* j/ f. F' J: m% q
  273. #            "Book_Date" = str(datetime.datetime.now()),6 y6 |4 E+ R0 u1 m: o# n+ p
  274.         }
    1 _8 ^0 t9 D) Q; K, \1 e  I
  275.     def download(self, P_dir, imgDir, file_name, Book_img):2 Z& \4 r' u- i/ [
  276.         if not os.path.exists(imgDir):
    9 C& U; t& X8 V8 g
  277.             os.makedirs(imgDir)7 D  r" ?* x  G! x9 J
  278.         file = imgDir + "/" + file_name' X1 R9 V& f/ t, `& X. j8 T! d! W
  279. #        print file2 i/ d/ U, U( \) M+ O. ]
  280.         f = open(file, 'wb+')
    ( Q) n4 \2 \4 q6 C( V" m2 v
  281.         imag = requests.get(Book_img) ( t# o1 l* V8 l: D4 O, \+ t1 M! g5 P  i
  282.         f.write(imag.content): ^2 k9 @  j& k$ h9 c
  283.         f.close(), u/ f# _; H1 X3 g
  284.         #保存图片前5 ]% h8 D; [6 W
  285.     def save_imgs(self,response):, M. ?# i  A6 ~6 t- E# @! t' I
  286.         content = response.content
    ; |# n3 y( P% o: T* H
  287.         file_name = response.save["file_name"]) `- a) L" i) T: K
  288.         imgDir = response.save["imgDir"]) b; W' D+ F$ E4 A# T" |
  289.         file_path = imgDir + file_name) M) k- N7 {3 t, R" p
  290.         self.save_img(content,imgDir,file_path)1 Y; V$ C; ~4 o
  291.     #保存图片
    : G+ p3 }; f4 p" u' M
  292.     def save_img(self,content,imgDir,path):
    0 Q! g& p8 ^8 S( a& m) t( o% m* ?
  293.         if not os.path.exists(imgDir):                        
    ; F5 N, I& [; b7 e4 ^
  294.             os.makedirs(imgDir)
    - {# B0 r  B5 I# q: u
  295.         f = open(path,"wb" )8 t/ c7 J: a- S- {' ~
  296.         f.write(content)
    8 l/ L5 |- o9 ^/ O
  297.         f.close()
    & ?3 g( C3 M$ r% v. b" P8 T
  298.     #获取url后缀名
    - I. X9 Q  z3 T& e' C) q
  299.     def getExtension(self,url):                            # I8 |4 g& ~( l' U! _6 X
  300.         extension = url.split(".")[-1]4 L' `( d7 P* l* N
  301.         return extension / T8 J: R9 j3 E; h  B
  302.     1 s- c$ Q- i4 b# G1 O- H
  303.     #获取图片名
    6 @. |+ e: d& O7 I
  304.     def getname(self,url):
    - K3 n1 E+ P$ {) E- x& J
  305.         name=url.split("/")[-1].split(".")[0]& ]2 v" ^0 r8 L
  306.         return name
复制代码
+ l! L, h  @7 w* K: K; C4 }

5 d4 f6 T# d2 r% w! P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-7-22 00:25

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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