找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
2 `/ ^' N- C/ A7 S
  1. #!/usr/bin/env python
    3 `+ ?' X$ E$ c3 c+ e; a
  2. # -*- encoding: utf-8 -*-
    $ i$ v0 H) v  Y% j
  3. # Created on 2019-05-05 21:43:11" _: W: ~# o1 y8 G
  4. # Project: XiaoShuo
    ! f, a9 @) W' f. c1 A5 L
  5. : S+ N7 c( y" Y
  6. from pyspider.libs.base_handler import *
    6 C% y9 k3 c' W7 S3 r2 h
  7. import pymysql
    : H2 i+ m" J" H8 @1 f7 D
  8. import random
    , C2 R/ d+ A1 i
  9. import datetime3 }* Y; M1 T1 m# K2 o
  10. import urllib2,HTMLParser,re" C! b! H" J2 k$ F+ ]3 ]5 `( ~
  11. import os2 `. z1 l8 g' S. w. J. h- Y+ X5 F
  12. import sys& f( U, I5 A# b3 V: m7 X+ C. L; I  I
  13. import re
    5 |# ?- C! {; B8 @4 E3 E9 f
  14. import codecs
    0 f2 C: L" h2 a6 ^! q
  15. import requests
    & f# Q0 o5 D2 h: ~* o
  16. import json
    " [6 K6 Y4 ?3 i. l; R) G2 z

  17. * r1 i& w. m( ]: x  \, f! ?' y, t
  18. class Handler(BaseHandler):
    * @8 a( D1 S$ z/ f: V7 P! g
  19.     global Datos. a/ K* c) c* P3 m4 V' p# J
  20.     global P_dir      c) f5 X9 r- M/ A6 F
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径& C* L8 @0 Y3 Z! }& q# H% J' u
  22.     global Datos: ]- R$ b9 B' n: w9 t8 x* s
  23.     Datos = {}1 Q3 ~) ?8 c4 \. U. u# ^
  24.     headers= {3 M( `: Z1 t3 M' c# u7 _3 f! J2 N
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    : T. Y: w7 ^" J& {
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    2 X/ B* X5 ^9 @$ q  @6 d, K
  27.     'Accept-Language':'zh-CN,zh;q=0.8',8 A* P$ \. a4 t6 ~! K
  28.     'Cache-Control':'max-age=0',
    ) E2 l+ C& I$ r: R, U5 K
  29.     'Connection':'keep-alive',
    & L: R- N- }# l3 W
  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'- a- }' s7 P; G! x
  31.     }& ]7 L! f0 b( @
  32.     crawl_config = {6 W/ [$ m4 o# M2 A
  33.         'headers' : headers,
    # l8 D/ s% y: O# m. r* v9 B
  34.         'timeout' : 300
    ! s- I; S% j1 k" H
  35.     }
    3 F1 J9 g& j9 g* W( V
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    0 Y8 L, h& j+ K1 k. X
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")0 R% c; j3 J& h- f2 G
  38.         try:
    + G& X' \( {; Y: m+ y( l
  39.             cursor = db.cursor()
    ) e- F7 f; D; D: R& \0 ?8 s: g; V- q
  40.             #注意此处字符串的占位符要加双引号"%s"
      U- J4 D6 |; S% a+ B& d1 x6 y! o: C% d
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);8 c- j" x# b' ?, Q2 u
  42. #            print(sql)* @3 v7 i+ V; y/ N/ Z1 C  j
  43.             cursor.execute(sql)
    8 P- O% W$ D4 P! e( ]/ S+ c; W* e
  44.             
    ) o6 q: H8 V" j/ C" N
  45.             #qid = cursor.lastrowid( a- r& Y9 N9 v5 t7 |) ~
  46.             #print(qid)0 [* o: N9 ^( q7 P2 W7 a+ U
  47.             : j6 G3 K9 B1 b; D% m
  48.             db.commit()4 ?  t% `7 w: |8 N/ T. V
  49.         except Exception as err:& E; l5 J8 [) W
  50.             print("Error %s for execute sql: %s" % (err, sql))
    0 `3 v+ v! V* i% ?) K- Q
  51.             db.rollback()0 v0 `$ v+ j. R  ^# I% u' {
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    % J3 x" G# p5 X0 Y; x6 S
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"); V$ }( m  i+ ^6 d
  54.         try:
    % F; ]2 s6 m* v" Z
  55.             cursor = db.cursor(), N# o4 U7 }+ g' N1 u8 g
  56.             #注意此处字符串的占位符要加双引号"%s"0 s7 |* P9 \# r
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);# {+ _- X2 A8 L4 D: @2 r
  58. #            print(sql)
    4 W6 l1 F7 k8 r3 H: H6 M
  59.             cursor.execute(sql)
    # B- B: }! F+ g, W9 ]) n
  60.             
    * `, [9 [* K0 W5 G, C! U  }
  61.             #qid = cursor.lastrowid
    * S! B/ g6 H! s% M
  62.             #print(qid)* z9 P  t$ G8 D2 ?4 o  L
  63.             
    9 j# k5 Y- M) z
  64.             db.commit()
    . q% T2 L! D- {% v
  65.         except Exception as err:9 C& @' W: i- W/ A$ b
  66.             print("Error %s for execute sql: %s" % (err, sql))0 j/ U  M( Z9 j* j2 i/ Q$ ~4 P
  67.             db.rollback()5 k9 F: }8 v# G$ y6 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):
    . A- K( a* Y6 k) J8 C! Z( P4 h& O5 G
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")  T6 H8 B% Q3 j7 |
  70.         try:
    ; N# H, s6 h0 e; y8 K
  71.             cursor = db.cursor()! O! F) K/ v! }2 X* C: V7 C
  72.             #注意此处字符串的占位符要加双引号"%s"
    1 X: k1 D; _3 D
  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);- x) r1 L+ ?8 ~6 U) g+ K
  74.             print(sql)$ }# R  T+ F) S. e4 t. g
  75.             cursor.execute(sql)
    8 ~' r) ^8 G8 d! `& B" e
  76.             print(cursor.lastrowid)& u- |, Q: O1 y2 q* J
  77.             db.commit()3 F6 U# y7 `$ v2 p/ U
  78.         except Exception as err:
    ' K  p- G, I! |( a
  79. #        except:! g$ P! G0 \' u" i
  80. #            print('Failed')
    3 _4 D7 A1 K3 D8 }
  81.             print("Error %s for execute sql: %s" % (err, sql))) [! a8 I' V1 ?- V, r0 l" q
  82.             db.rollback()
    . C8 G* w0 F  B; [; w5 I4 H" b
  83.         , K+ ~/ b0 C0 I7 f  L
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): + L7 m; J# E/ m3 f
  85.             reload(sys)* r4 z3 B; K" b. f9 g
  86.             sys.setdefaultencoding("gbk")
    2 z% F' V0 q, B; @( U% i
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    . b5 E! }* J# o; j% m
  88.             locoy_data = {
    + L1 K+ L/ ?6 C5 n
  89.             'my_u':'用户名',   #后台用户名
    / C+ B2 L1 c% R4 C
  90.             'my_p':'密码',   #后台密码  M! ^$ t( j+ P; W9 k: e/ H- y$ _. X
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    , N; [& X, [4 J( Y
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),, m$ O5 s! ]! a9 w
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),# e8 N' }0 }* Z0 y4 @
  94.             'article':BookConte.encode('gbk', 'ignore'),2 V# q% i6 x6 a. {4 G
  95.             'author':Book_author.encode('gbk', 'ignore'),
    - B* M5 L/ B) P
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),& X5 y4 V' m  [4 F7 a. r( R
  97.             'thumb':Book_img,9 N& K3 F$ y  J
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),/ m# y) D. [4 ~% Y9 f
  99.             'abover':abover.encode('gbk', 'ignore')           ) C3 }; {3 b% U5 M, A1 X3 G
  100.                 }
    ! u1 H, l6 D: T, I) C& E, K5 P
  101.             res = requests.post(locoy_url, data=locoy_data)
    ; e) ]1 B* {% C2 \7 t0 ^9 @  D6 w
  102.             print res.text7 T4 S7 j4 b$ {* ?( L2 N% }
  103.             print res.content, U' W, d; M, N7 ]6 G; {9 {& `$ R
  104. #            print Dsd
      T' z, S3 |1 I1 z* x- Y
  105.             return res) a7 c" T4 n, l6 F
  106.    
    ; a# |- O  N3 G6 ?
  107.     def __init__(self):+ l2 A+ q$ O# L( w8 Z& P4 T
  108.         self.base_url1 = 'https://www.****.cc/'' s1 m- Q5 d( ]3 i5 N2 b0 j
  109.         self.base_url2 = '/': x$ i! W- R- Y6 [& {
  110.         self.CaterId = []
    1 c6 @/ u/ ~4 {9 |; T) @
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']$ Q6 |6 z# p5 _
  112.         self.page_num = 10 R6 C$ d! O4 W# P! z, Z
  113.         self.total_num = 200   
    ! U  l: X6 d; p( ~
  114. : Y' s% j* d& C* N+ O
  115.     @every(minutes=8 * 60)
    " T0 v, J# t9 A( n# T9 o
  116.     def on_start(self):
    8 m& b( l" I9 r9 n
  117.         global Cater_Name4 [4 }& I" }% B+ w+ \, P1 w
  118.         Cater_Name = []& `# o8 c  j) ?3 m- l8 X! m! D
  119.         while self.page_num <= self.total_num:
    0 E3 W# L' l& T2 s
  120.             for self.CaterId in self.CaterIds:
    + K9 m2 g+ @  h! c) M- l) q. ^
  121.                 if self.CaterId  == 'xuanhuan':
    ; Z" D1 ]$ V: Y. t
  122.                      Cater_Name = '玄幻'& j( O7 F2 p) O  [% K
  123.                 if self.CaterId  == 'wuxia':
    * J& L. J4 q' g" E- d
  124.                     Cater_Name = '武侠'
    4 {/ f* u, v& ^! w) _
  125.                 if self.CaterId  == 'lishi':
    # r  O; G5 V# f" o) K7 H) j/ D
  126.                     Cater_Name = '历史'            , n2 C/ z) P9 x9 {* f
  127.                 if self.CaterId  == 'yanqing':
    1 M9 I% `8 M/ P( S
  128.                     Cater_Name = '都市' * F' h4 N9 [9 @" T) Z0 a
  129.                 if self.CaterId  == 'nvsheng':
    1 M2 X, P. m. f) ]7 M, ^
  130.                     Cater_Name = '都市'
    9 g9 A! C# {. o$ ?; o! g8 J9 r
  131.                 if self.CaterId  == 'kehuan':. I- z4 M) b+ Z/ |3 S. l0 I
  132.                     Cater_Name = '科幻' / y; a/ i; L9 D- l% S1 G, e" S
  133.                 if self.CaterId  == 'kongbu':
    4 |: F3 v$ E9 J. \: ?- D! y  ^7 e
  134.                     Cater_Name = '游戏' . Y( m. l$ J2 v
  135.                 print self.CaterId8 }# R6 {8 f$ @2 @# z8 f
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    " N- S1 g0 ?, h9 b
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)" }. F. t# ^( j4 W
  138.             self.page_num += 1
    * Z. [, W; n; C5 o
  139.             
    2 {/ o/ e  }2 g) L
  140.     def list_Caterg(self, response):1 Q8 x6 m9 J# j4 C8 u9 Q- h* }
  141.         Cater_Name = response.save) O4 ]0 P+ W3 X6 D7 a/ m
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    : |, N9 |# R5 }' z) k
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
      P; G- ?- m( y- g2 F0 ]
  144.             
    ; W; b8 r9 z; O, Z9 G) w
  145.     def list_Caterg_detail(self, response):
    ( B% i, t8 m# K
  146.         Cater_Name = response.save
    6 W$ F. g; g2 ~2 K. F, g( J8 L
  147. #        print Cater_Name
    / s7 h* h% M8 d0 t
  148.         Bookname = response.doc('h1').text()* L' ?4 F$ D+ e: ^! q5 S
  149.         print Bookname  r5 U# X& y! z
  150.         Book_author = response.doc('.authorname > a').text()1 _& Z; x- D$ S1 J
  151. #        print Book_author0 v; g+ \3 o$ A; F& Z4 S3 v
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    : ]; G5 X/ `8 t& ]2 v
  153. #        print Book_Introduction
    / Q7 f! M1 O( k/ n& I
  154.         Book_Synopsis = response.doc('b').eq(1).text()8 x' M9 [: \$ G8 W- ^
  155. #        print Book_Synopsis5 g+ ]8 s0 k0 f4 R  g- P2 s" b0 ?
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]5 p# E9 T9 D: M5 G6 R. H
  157. #        print Book_Palabras
    ( `$ A# S8 Q4 t5 S7 n7 a
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID, [# @- x5 a1 `. L# s7 `1 w& l5 i6 t
  159. #        print BookIDs
      D& |/ \: A! Y# f
  160.         Book_Dates = str(datetime.datetime.now())         
    " K1 ^& i; y& _4 E+ g
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    4 c0 p3 ~% w* m& }
  162.             img = imgs.attr.src
    ) ?3 _, s: [4 [8 M; X8 D
  163.             print img" ?+ F) W# n% N& [1 s) b
  164.                 #小说封面下载
    5 ?+ I% Q+ y1 R
  165.             extension = self.getExtension(img)3 h# [# \; o8 W0 ?. m  v
  166.             name = self.getname(img)
    5 O# P; e# }7 J
  167.             file_name = name + "." + extension
    9 h# E' q% i* K  V  y. g' W
  168.             imgDir = P_dir + name
    7 r( f+ ?  [% Y1 F
  169.             Locaimg = imgDir + "/" + file_name
    : C: S/ U2 E9 o. f
  170.             print Locaimg9 G9 r1 s0 A. V$ a0 L+ w. |
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    ' Z( u2 }* U" a1 X
  172.                 print('attachment url is ' + img)               #
    9 `* m" ~, Y- Y, F6 P) T! `2 Y
  173.             Datos = {
    % ~( k. y0 O8 J+ q" N
  174.                     "Cater_Name":Cater_Name,( y8 _+ Y) `$ n: @# \
  175.                     "Book_author":Book_author,* F  [7 U6 E0 G9 L1 D9 y
  176.                     "Book_Introduction":Book_Introduction,
    , e3 R; n7 Q+ ]0 W2 S
  177.                     "Book_Synopsis":Book_Synopsis,2 H: t+ d' C! o( @4 R
  178.                     "Book_Palabras":Book_Palabras,& Y! l# O% b- n+ Z, i
  179.                     "img":img,: l5 p3 i- N, M2 z
  180.                 }
      _5 n7 i( T5 `3 q1 C
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    ' v! ]2 f) X- @7 N
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():' m2 w: g& f4 @9 }( @! B. G
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    9 r: o8 r& x0 P' j
  184.             
    & N( i! D+ n0 N! [2 `  c
  185.     @config(age=8 * 60 * 60)   
    3 ~6 A$ w( F( x4 |& a! v
  186.     def index_page(self, response):
    6 |/ |# _" B) m. _
  187.         Datos = {& I" S; m- }  T) O& A" N" i* @0 @" r
  188.                   "Cater_Name":response.save['Cater_Name'],9 U4 y* l2 o* E
  189.                    "Book_author":response.save['Book_author'],
    2 J- p! W6 @0 F
  190.                    "Book_Introduction":response.save['Book_Introduction'],; i8 M4 E* j7 e1 J$ F
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    " a# _. \/ l" t6 `9 l4 |3 q: G$ O
  192.                    "Book_Palabras":response.save['Book_Palabras'],4 g0 g2 u( j7 j& J! i
  193.                    "img":response.save['img'],
    . F* G, q/ j. |
  194.                      }
    2 }' R5 h2 [. f! g5 `) G
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    8 a7 V4 R+ T8 K; i. {5 O/ {
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    . }( W7 |' l; g$ |! h- ?
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    % i3 j. W3 U6 [2 e- ]* |* H- J0 ~2 j
  198.     @config(priority=2)4 V  ~. }) l) t
  199.     @catch_status_code_error
    0 s( {% L. l( B  ^& @. |& \( C
  200.     def detail_page(self, response):        
    ( f; L, `3 I# q: b9 q" t
  201.         NewRe1 = u'哈书'8 Z( {0 C: O& _$ j
  202.         NewRe2 = u'huhjsd.CC'
    , [) Q% L0 ?. S
  203.         NewRe3 = r'^\\n\\n'& k' Q2 k6 Y2 ^6 J' Z: {6 e
  204.         NewRe5 = u'小说网'5 z7 l3 Z" b  r6 x1 k0 z4 Y
  205.         NewRe6 = u'fgdfgf'( n6 Z8 l, P8 c2 ]! }8 W
  206.         NewRe7 = u'fgfgf'
    , S9 Y# ^' {! o& s+ Y+ n+ f" L
  207.         NewRe8 = u'ffhgf'3 u  |; k3 R3 ~& K: A# }
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'3 \( R5 b% _5 l2 _4 d2 {: j+ R
  209.         ReC1 = u'静思'
    / h" W* {* ^! f: C/ T+ l1 O- b
  210.         ReC2 = u'aghgf.com': U. _; W8 [( I
  211.         ReC3 = u'aghgfh.com'
    8 D7 f  D/ d0 l9 H  U; w6 b
  212.         ReC4 = u''9 K" e1 M" s& R8 l# F% v/ i
  213.         ReC5 = u'文学网'
    . m- f- G- G+ ?$ C3 r3 E, \8 e4 C( n
  214.         ReC6 = r'<BR>'
    & i3 p( q3 `  X0 W
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称! R: }1 L9 f0 @% j) G
  216.         print Bookname
    6 a! Z5 H7 O, X+ \5 o
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类7 r& L' D9 |4 R4 P4 d# s! x0 ]+ Q" q' D
  218.         Book_author = response.save['Book_author']   #小说作者& S1 T# m& Q9 p6 c, W5 D3 b1 q
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    $ H7 V) u2 L9 r# `% w
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新, v: h; \  [* Z
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    : M% B+ [9 A7 @% b8 I; g
  222.         Bookurl = response.url   #小说网址/ k! }+ a5 G3 c* `. k9 x
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    ( k! `& Q. Q/ B& L. {" E. X$ E8 H
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    - K3 `# y! o' C0 a$ a, A
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容/ a0 T, |( {% t4 a
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)% }* G' _% _- I/ j
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    0 \0 g9 W; v& w* l/ {# M  R" B
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    7 r. D7 I" Y, G- s2 A
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)2 b. Q" H9 ?$ z
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)! Z, U% k, K2 ~  h  f" {
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    . |0 d' V3 X# `- V3 z# g
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    : ]/ R. V* B- d2 L* z. f
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)7 Z4 X8 I8 K. e+ P3 i# M, A
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    . p, V& t7 ]* R2 s4 w
  235.         BookConte = BookConte4.replace("\n\n","<br>")7 N0 N6 ?5 |  d7 Q5 U
  236.         print BookConte( L3 Q! s' Z, M/ B3 F8 B- C
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    7 V8 n/ W! O/ S9 F7 `
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)& Z6 i( r# Q# r, E" C
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)5 \8 ?" C! m0 z- o# O4 V3 ]
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    : p9 J# {; L  k
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     , z. J9 C0 `# ~6 Y
  242.         Book_img = response.save['img'],  #小说图片
    ) \! C1 f7 y! x7 H9 |& {
  243.             
      L! p) q% M8 c
  244.         #insert into MySQL 小说入库+ t1 X2 V( n4 e
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    : ^  Q1 k6 @$ D- [* {) E, \" L
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    3 R" z) M# V. t* q
  247.         #post提交发布
    " P0 v5 v/ c+ k
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消% W7 U7 y. ]$ b" X+ ]
  249.         Datos = {9 Y4 W+ Y  }6 M$ d. K; ^  v. h
  250.                   "Cater_Name":response.save['Cater_Name'],% \; b( H) I8 H3 Z  h
  251.                    "Book_author":response.save['Book_author'],
    4 A  |. V, L1 d* a( g
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    7 b# A$ A: u/ y  x# y: ]/ W5 |7 ]' Z
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],# a# M( `, T; s- q- |* ?+ G. b% N3 C, v
  254.                    "Book_Palabras":response.save['Book_Palabras'],( t# B" U0 X( h
  255.                    "img":response.save['img'],
    " H, M2 C. V9 z) ^' r
  256.                      }
    ; D7 o  n& L+ S" ]
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
      L* {! u7 h8 T$ g
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    # ~7 e+ t3 C& W2 J+ r& Y
  259.         return {
    / ?' a$ e3 S. T9 G
  260.             "Cater_Name":Cater_Name,4 {1 ^7 ^" ?1 p: {
  261.             "Bookname":Bookname,% Y5 ?- w; J+ L/ ^
  262.             "Book_author":Book_author,
    8 P- f9 a% U6 x1 c
  263.             "Book_Introduction":Book_Introduction,, _4 v- c! R* h! {# r
  264.             "Book_Synopsis":Book_Synopsis,
    ' v$ j4 ?+ p1 l. ]# _  J
  265.             "Book_Palabras":Book_Palabras,
    - m  v+ z& C+ Q8 a
  266.             "Book_img":Book_img,  {  Y$ k4 @3 E% J
  267.             "Bookurl": response.url,
    ; s) }2 w  V! E2 j+ K5 y+ B
  268.             "Booktitle": Booktitle,
    " p* b% V7 v) X1 ]6 |/ A
  269.             "BookID": BookID,
    ' c3 L6 U4 r$ E8 A: y) J) k
  270.             "BookConte": BookConte,! g6 w2 }! n: `" D7 N1 ^
  271.             "Titleid": Titleid,
    % [9 w6 ?( a$ O  ?
  272.             "abover":abover,' y2 }3 d* ]" |9 n2 x
  273. #            "Book_Date" = str(datetime.datetime.now()),
    " ?( U/ l8 ~* v. ]& B- c1 ?
  274.         }$ `. _( r3 k( @) m) @
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    , Y. j; Z' N- [; h- _: D
  276.         if not os.path.exists(imgDir): 1 Y$ {$ r* B' ~4 V, t( S
  277.             os.makedirs(imgDir)3 S) G9 j( u( E
  278.         file = imgDir + "/" + file_name
    , m0 d; ]! t; K
  279. #        print file* E; g. Q' u/ S+ Q* i+ S: }
  280.         f = open(file, 'wb+')5 c( n0 @% Y( X1 `
  281.         imag = requests.get(Book_img) + H/ k1 u4 ]( X- m
  282.         f.write(imag.content)
    ( x, s  C* t$ k  E( r
  283.         f.close()2 Y, }' [8 u) B% V
  284.         #保存图片前
    , `0 N8 S" q* u( u# s
  285.     def save_imgs(self,response):8 B  i! R4 E  \3 ~
  286.         content = response.content& N, r/ [' F8 S( M
  287.         file_name = response.save["file_name"]  A2 m) F  ^& E/ ^
  288.         imgDir = response.save["imgDir"]
    4 K' t; o2 G, i) B8 [
  289.         file_path = imgDir + file_name
    2 g0 h( u, a# e3 m$ L" Y
  290.         self.save_img(content,imgDir,file_path)
    / x9 ~$ {2 U. C1 b3 Y" t
  291.     #保存图片9 ~1 @7 T9 O! X* K0 y+ I
  292.     def save_img(self,content,imgDir,path):1 N* S0 \7 a" j9 v; s0 z0 p( G3 j- [
  293.         if not os.path.exists(imgDir):                         2 }' \! N8 z; n8 u
  294.             os.makedirs(imgDir)
    6 L- p, r1 j5 A3 D( g( @: {& x: o
  295.         f = open(path,"wb" )7 y0 ]/ x3 v6 [6 c1 e. O+ q
  296.         f.write(content)6 N. N' D2 v& {* v" N8 g
  297.         f.close()
    % b% Q0 Z, k& \1 \6 E/ T
  298.     #获取url后缀名
    ) [0 x0 B' H$ b6 x; ]: b* L. y
  299.     def getExtension(self,url):                            7 A3 D$ K' M; \
  300.         extension = url.split(".")[-1]
    , |* N  H/ ?* U9 y6 f
  301.         return extension 8 K  w6 [* O6 x
  302.    
    9 b4 n) g" k7 F3 i
  303.     #获取图片名
    : C" S5 U7 h1 ]- c) w
  304.     def getname(self,url):) q$ d( B8 W9 W5 K7 J% ]5 |
  305.         name=url.split("/")[-1].split(".")[0]" B- s$ u, e' u* u& J7 a) w
  306.         return name
复制代码

4 T; w+ M, N( b' v. d( P
* S4 J/ I( ?. y4 G( j7 r4 D
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-26 18:07

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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