找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
/ @$ f4 ^3 x4 x6 d# q  F4 d7 O
  1. #!/usr/bin/env python5 e( H+ z# X: F! i1 u( u# g
  2. # -*- encoding: utf-8 -*-
    * V$ R# ~* X; w8 w: ~( h7 Q0 j; T
  3. # Created on 2019-05-05 21:43:11
    , C. l$ e! e- N3 O! n
  4. # Project: XiaoShuo
    7 t& T8 k, G( t: |$ O
  5. # A  S5 N' r% I  Q
  6. from pyspider.libs.base_handler import ** w4 @5 W# n; i# {  D) }
  7. import pymysql
    8 n! A5 k1 B: u/ t
  8. import random
    0 l- Z$ H. W/ F! E( b: L, M
  9. import datetime$ ~% K6 P. M, `* A3 t. J
  10. import urllib2,HTMLParser,re4 W& F: z- J# k: P% Y7 Q: T
  11. import os- I0 u+ ~9 @) H: n+ A/ u
  12. import sys. O, V6 a# ^3 a+ A$ \. I- q
  13. import re3 C! {7 T) I6 H( G+ k$ j
  14. import codecs
    / z% @3 D% z2 h/ {+ ^$ y
  15. import requests
    ( W& h! ]' z* L9 w
  16. import json7 |: H# A. r! w5 X, T# B

  17. . ~& {$ \) V. I  ^
  18. class Handler(BaseHandler):# J0 j- T8 P, v& i
  19.     global Datos
    # P* W" [  h8 \2 [
  20.     global P_dir   
    # \  l! [+ _2 L1 J9 d( ~! X
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径$ T# M$ b: W! j7 o4 F8 z- K9 b
  22.     global Datos
    4 w# Z$ {6 p' s& Q6 F& n# a* A* a
  23.     Datos = {}; @; ^$ c& K* Y% N2 D2 e
  24.     headers= {
    * A: Q& `6 V% X0 f
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    5 y% ]* d" D& A5 D
  26.     'Accept-Encoding':'gzip, deflate, sdch',+ v- y4 B0 W! a$ X' f0 c+ m2 m/ z
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    / m. w; b4 {" N3 L( g( x  {
  28.     'Cache-Control':'max-age=0',7 G1 d/ O2 e8 z% S  c
  29.     'Connection':'keep-alive',9 P+ K- \6 U$ T% \* x! W' p4 {+ I
  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'
    6 d* X; b7 _7 E
  31.     }
    2 W. [. H+ p/ o( I
  32.     crawl_config = {
    : @" N5 @2 K; g2 o! p1 o+ d
  33.         'headers' : headers,# T6 {( ]! F0 F0 R* l
  34.         'timeout' : 300
    2 y1 r+ b+ {' T! M  G. R: V  L7 k- [
  35.     }; n2 p" [( ]* Z! R. ^' T' t) ?
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):0 U8 U8 p$ n. d2 ?5 q0 v
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    0 k8 n& M; E, n" C2 i6 w
  38.         try:) a8 t2 @# }/ f3 c
  39.             cursor = db.cursor()
    1 _+ X6 q% W6 K7 W6 Z: B! q
  40.             #注意此处字符串的占位符要加双引号"%s"
    $ R, z- F# q8 w2 J. w
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    2 R) |. h3 T8 e: i
  42. #            print(sql)
    ' N3 o1 j1 \+ n5 J+ [6 d* A
  43.             cursor.execute(sql)
    - N) A7 N/ L2 _/ @6 R* T% Q6 c
  44.             
    : ?/ y7 \( Z9 d8 ]& c$ p1 F6 T
  45.             #qid = cursor.lastrowid8 j/ K5 ^  [' _, X  i' S
  46.             #print(qid)
    2 g% {7 D9 R; A, @' t1 Z
  47.             
    ; |) r$ A. X) s4 I
  48.             db.commit()
    1 F+ }. Q5 H1 U( y  Z) V( }, u
  49.         except Exception as err:& o; H! _' }8 B: }) ^; a& ?: V# B
  50.             print("Error %s for execute sql: %s" % (err, sql))
    % `5 l- V3 |& C5 Y" |
  51.             db.rollback()" {' U/ M5 _  ]) q
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):( \2 A/ `3 P3 K4 Y" N2 \/ r: n
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"). v: x9 V9 x6 y, v. h1 q& @
  54.         try:
    ; M% f* `3 n3 i# ^& u2 j5 @
  55.             cursor = db.cursor()
    7 [3 F2 A! X7 M7 R! H1 Y
  56.             #注意此处字符串的占位符要加双引号"%s"
    + A9 K9 u" d8 K9 v, g5 h! [$ o
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    " Y, y" z9 V) E" I
  58. #            print(sql)1 n# A. h7 l, ~# s4 r
  59.             cursor.execute(sql)
    & k5 C9 G* w' H; a8 _* v- M- `
  60.             
    : \$ V& j& e& a  X$ `" i3 I
  61.             #qid = cursor.lastrowid1 r' @1 G2 |, G7 i) _& x- d' c
  62.             #print(qid)
    8 h& b$ A) A& J! }9 n% @5 P
  63.             
    ! N/ E- j0 B8 D" E8 T- h6 E
  64.             db.commit()
    5 L  D1 p) Y0 W* X
  65.         except Exception as err:7 {, ]/ `6 e- v$ I- J
  66.             print("Error %s for execute sql: %s" % (err, sql))9 D5 s; q' w6 e) L' [! L
  67.             db.rollback()& B. _3 Q, o" c; b
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):' R( y( r6 n0 ]) C7 _5 P8 \! y9 L4 s$ e
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    7 z5 q8 W5 X, X
  70.         try:5 k3 ]4 H. @, h; ^- `+ ^- G% B1 ~% |% S
  71.             cursor = db.cursor()& ]; p/ q/ t3 P# x" G1 E
  72.             #注意此处字符串的占位符要加双引号"%s"
    4 ?1 i5 e+ P& N6 V( G
  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);
    1 U  `3 x, Y+ z$ S
  74.             print(sql)) T" @% R: a8 `; w, u
  75.             cursor.execute(sql)7 A1 m, N/ V1 K) d- b/ z. z& t# V9 z
  76.             print(cursor.lastrowid)( v3 Y$ Z* O) I+ }4 ~5 w. Z
  77.             db.commit()+ o6 r7 k" n( ]8 Z. D8 F# Q$ _- v5 U
  78.         except Exception as err:
    % L4 _! d+ b9 w
  79. #        except:
    ' F2 e% _! z  \6 J; J6 ~
  80. #            print('Failed')
    0 j: i1 K/ I3 ]* t+ @* c
  81.             print("Error %s for execute sql: %s" % (err, sql))
    . Y1 B' b( Q8 A) R9 ?; M' u
  82.             db.rollback(). \7 r  L1 }- X& o  O
  83.         
    6 {; ^2 o% ~  D& e
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): ' N5 Q5 Z6 B4 e) @8 D; E! [) X3 |/ [
  85.             reload(sys)
    ) j7 T9 ^/ {4 S9 c: b
  86.             sys.setdefaultencoding("gbk")
    " s$ g. [  M6 m" v. E+ s. U: V
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    ; e* b6 k/ K* g9 }7 u
  88.             locoy_data = {
    ; s+ P, x; M5 f9 N
  89.             'my_u':'用户名',   #后台用户名
    8 Z- f  i; h+ {1 Q% G7 u7 y, W
  90.             'my_p':'密码',   #后台密码0 ^8 J  Y, @5 d8 o1 Q: a: s
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    # P& E3 `, s8 r: {; T; W7 }
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),4 q5 \: A5 `: q" U$ o. \+ R
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),2 y8 G$ I7 ~* T% j- h
  94.             'article':BookConte.encode('gbk', 'ignore'),
    1 J, }1 Y% k7 k, m2 K5 v" n- P
  95.             'author':Book_author.encode('gbk', 'ignore'),
    - q; a% E0 w4 Q) C1 d9 `, D
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),6 H1 c3 W: u: Q/ a# G) y, Q! y
  97.             'thumb':Book_img,: \9 T" S# s9 y* ?, O6 A& T
  98.             'content':Book_Introduction.encode('gbk', 'ignore')," K% d# r3 g8 \
  99.             'abover':abover.encode('gbk', 'ignore')           ( ^$ y! g8 p# T# W
  100.                 }
    3 J" T( r/ s  K% R" y" I
  101.             res = requests.post(locoy_url, data=locoy_data)# `; x! |" ?2 t# h
  102.             print res.text
    & N9 W: O4 j5 N5 h/ O  |5 J
  103.             print res.content
    + G. \8 u9 l9 i2 F) k4 V1 s
  104. #            print Dsd: i! e! u3 x$ A" E5 ?
  105.             return res3 g/ G( r, F1 h% T+ q% e' v
  106.     5 l+ W$ z# q5 O/ K% k
  107.     def __init__(self):
    9 o# a* [: L+ P+ P2 o1 W3 y
  108.         self.base_url1 = 'https://www.****.cc/'
    5 x  H$ E  B( ]
  109.         self.base_url2 = '/'
    / C) t+ u: x6 V+ K. t- x2 q. d; l& E
  110.         self.CaterId = []
    ; f3 L" j  v1 q1 x2 s
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    % [" i% B, S; X' M; K
  112.         self.page_num = 12 f( B, L5 N1 ]; F
  113.         self.total_num = 200   # A9 f( j6 }4 o% m# P9 A% u3 H

  114. 9 d, Q2 w' S- B% H) G) ~" m7 x1 o" E
  115.     @every(minutes=8 * 60)
    / d/ g5 o" T! @; ?' p7 g& H
  116.     def on_start(self):/ |) L! c- S3 ?; M+ {4 d
  117.         global Cater_Name
    1 l. ]3 I- t  u& g# {- h/ a9 R
  118.         Cater_Name = []+ `: [0 m  {# C& O* z" o4 A
  119.         while self.page_num <= self.total_num: 7 C! g4 W4 `) V7 W8 i) w
  120.             for self.CaterId in self.CaterIds:
    ) B; r! @# ]& U1 l6 v
  121.                 if self.CaterId  == 'xuanhuan':7 p: d3 G6 {9 {5 f' {: Y+ {
  122.                      Cater_Name = '玄幻'
    7 d- B; K0 N/ x6 ~$ J' q) J9 J
  123.                 if self.CaterId  == 'wuxia':
    # G3 B/ }7 A6 \9 R" _: q) u
  124.                     Cater_Name = '武侠'
    / [8 ?) k- G6 n2 `1 m$ Z
  125.                 if self.CaterId  == 'lishi':& ^% G3 [" U0 q  K4 ?: r, ?
  126.                     Cater_Name = '历史'            
    : c, D# j' E* A/ q! p! p
  127.                 if self.CaterId  == 'yanqing':) c& }' N, Y; ?* |0 b
  128.                     Cater_Name = '都市'
    2 D2 b0 P' U4 W5 Q" e4 r
  129.                 if self.CaterId  == 'nvsheng':" ~0 y7 b4 Y8 s1 R9 J
  130.                     Cater_Name = '都市'
    ' E, v3 F- \: M$ y& j+ w0 ]
  131.                 if self.CaterId  == 'kehuan':
    6 @" s( f. t( l: ^) c
  132.                     Cater_Name = '科幻'
    5 E3 o  o' w2 S' \% {
  133.                 if self.CaterId  == 'kongbu':: x" J. m4 F# H) T$ C' A: J/ ?
  134.                     Cater_Name = '游戏'
    . x: h- l: e/ |
  135.                 print self.CaterId
    9 q# Z4 ~) y' [
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          # ]# l$ t- F$ g0 `$ X8 e
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    5 e+ j% ?3 B3 @) w
  138.             self.page_num += 1 3 r  c" @$ Y! u4 g1 i9 X
  139.             
    - }) D7 c" q. U8 H: I
  140.     def list_Caterg(self, response):
    4 S7 M  i" m8 ]0 u6 Q; C& K1 |
  141.         Cater_Name = response.save
    1 T' u; S/ P& n" b& w9 ]/ b9 j* M
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    5 a& G5 R9 z, d( M$ ]% G
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    : u0 ]: {/ h& c" j
  144.             
    & C. M( b. o- _0 c4 g
  145.     def list_Caterg_detail(self, response):
    % h' M) g; _# [, t
  146.         Cater_Name = response.save
    $ L# v- E" h" [1 Z
  147. #        print Cater_Name
    ) x( S% k) f; I& I4 N& F: \
  148.         Bookname = response.doc('h1').text()2 C, u  d/ _, Z+ V3 Y; t
  149.         print Bookname
      X' {" m  z8 H) |( ?# C/ R
  150.         Book_author = response.doc('.authorname > a').text()) [/ t6 c: Y5 Z1 t
  151. #        print Book_author
    / W6 D; V" t- Q. S- A+ {) \0 ]' w7 n
  152.         Book_Introduction = response.doc('.book-intro > div').text()& F, C2 ]- N" e/ H; ]+ @5 C
  153. #        print Book_Introduction
    2 {0 R6 _4 i0 [6 v' B1 I+ B+ v
  154.         Book_Synopsis = response.doc('b').eq(1).text()1 y, L, G" D+ z0 c: n" V
  155. #        print Book_Synopsis- P0 F8 J4 l! ]# r( P
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    * V* w. \0 b6 T. B; o; a) `; |) }
  157. #        print Book_Palabras
    & y2 y! M* W- P, c
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID- r1 o* l  O* z$ q; Q  K4 m
  159. #        print BookIDs
    . b- k! Y4 q5 G9 G) G+ U% p+ i
  160.         Book_Dates = str(datetime.datetime.now())         
    4 r4 o7 |7 I/ I
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    / z7 z( L7 u9 C% k
  162.             img = imgs.attr.src
    " b5 p( B" o1 R' v2 u
  163.             print img
    ) ^+ p+ I3 _4 W6 q" U8 E" t
  164.                 #小说封面下载' E* U$ r) K3 _) w& L2 x* Z& a
  165.             extension = self.getExtension(img)
    " K- c3 h; x: q2 M  Y
  166.             name = self.getname(img)2 K' y9 W/ S" M* J5 `. a
  167.             file_name = name + "." + extension/ ^$ S/ g' Q1 H( N5 U1 u; D
  168.             imgDir = P_dir + name
    2 z5 @4 j/ Q# C" D* \3 \% B
  169.             Locaimg = imgDir + "/" + file_name
    9 |/ y' \3 }% o/ ]
  170.             print Locaimg
    : O: r: i4 ?! J* ?
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    / E# n  `" z) \
  172.                 print('attachment url is ' + img)               #
    * ~. q( A  X( W. l' o: |+ c& f
  173.             Datos = {
    . u8 h5 J+ T/ p, l& e
  174.                     "Cater_Name":Cater_Name,% r- w4 M, G; X4 |3 ]- s0 O7 M
  175.                     "Book_author":Book_author,& H' Q9 Y1 L' f  B# }1 ~, z
  176.                     "Book_Introduction":Book_Introduction,1 c! \! U  z; i1 T" e; G( Z% W' E5 |
  177.                     "Book_Synopsis":Book_Synopsis,
    % I- v$ o( T. _4 X9 w3 u0 S) y
  178.                     "Book_Palabras":Book_Palabras,
    . U9 h! d& ~9 U$ Q2 E. D
  179.                     "img":img,* p9 ]8 Y" X  K" g0 Q, B2 m4 @4 _
  180.                 }
    ( O4 `# {/ ~4 n0 N
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布1 x' {  M. W) |" W6 o6 `
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():% w4 Q1 F: v0 n9 N# ^
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos), B# X( q9 \7 h/ I# [' B* n4 ]
  184.             , V) L# d! \9 }
  185.     @config(age=8 * 60 * 60)   
    1 s4 x% U- D1 q, \( h/ W0 E
  186.     def index_page(self, response):
    0 r' _/ e% x/ E5 ^% T* R
  187.         Datos = {
    ( G8 _1 U  x$ K
  188.                   "Cater_Name":response.save['Cater_Name'],
    : x2 r. `" g. d+ `3 L
  189.                    "Book_author":response.save['Book_author'],6 ]. j* S( e4 ]8 l
  190.                    "Book_Introduction":response.save['Book_Introduction'],* ?( r4 |, M6 F' |0 H; o
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ; o8 D5 G1 G& j8 j0 R
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    % u  j5 L7 f" V! U/ ], G( U
  193.                    "img":response.save['img'],9 r$ D8 l+ e% ^, k# x0 H
  194.                      }
    & R. M2 i% ^1 w" b- v4 x
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():8 Q6 R/ y  L  O8 b: ]2 _
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  7 c* U! [% \: C8 Q
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)" `* U9 N8 ^, o% b) R3 V
  198.     @config(priority=2)! J; X* W  @+ v5 G
  199.     @catch_status_code_error0 L* T2 g, c) V! p( D
  200.     def detail_page(self, response):        
    8 P/ `5 Q4 |/ A- _2 _5 L+ C" U5 Z
  201.         NewRe1 = u'哈书'
    # `0 o, j. D, Z
  202.         NewRe2 = u'huhjsd.CC'! V; w  ]: }; R4 J9 x0 Z
  203.         NewRe3 = r'^\\n\\n'/ J+ G9 Y, O( c* O
  204.         NewRe5 = u'小说网'
    ; I2 j6 M# I  N& X" T) o1 `
  205.         NewRe6 = u'fgdfgf'
    " P  O% {% x. m: ]9 c, j) \
  206.         NewRe7 = u'fgfgf'" i$ g; n: U. e4 f3 }9 G: n/ ]
  207.         NewRe8 = u'ffhgf'4 h3 n5 a) f) `. V" F
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+': l9 `8 l0 L  Q$ l
  209.         ReC1 = u'静思'8 N5 }  h- v% u. [+ H
  210.         ReC2 = u'aghgf.com') J! `- b6 M5 ]7 F5 G9 c
  211.         ReC3 = u'aghgfh.com'' T5 W1 I" p4 @6 @9 b- P) k
  212.         ReC4 = u'') [# q' {. q& Z1 c* U2 m" V! P$ Q
  213.         ReC5 = u'文学网'
    ' l/ I( t, s# C) |0 \+ W) T
  214.         ReC6 = r'<BR>'' b  Y# Y9 U, [0 V* v" D
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称3 Y' e, ^" x5 O
  216.         print Bookname/ i% d! v) d/ @
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    : J4 i9 A# L9 i  N! u" m
  218.         Book_author = response.save['Book_author']   #小说作者. K1 q0 o6 o1 i9 r
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    : ^- Z/ s3 j; C
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新% I$ m6 ?- J) p) ?2 \0 [
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数. [5 V/ g8 E+ M; ~0 S
  222.         Bookurl = response.url   #小说网址& v: N/ G# a: T' n) ]3 m5 L
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    ! i- E& j/ F& w4 M
  224.         BookID = response.doc('.readset-r span').text()   #小说ID. c5 T. y, ^& A4 Y9 H
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容' ?4 L: g3 V7 X8 m# {( b9 n; N
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成). ^3 M. q/ @" O  V  ~9 n7 Y
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间" l9 ]8 v# u$ f
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    " y( ^& x- L) I- B0 \. b( w
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)/ E3 L- L- o$ Z
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    7 t: x) K( Q, a/ g! u
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)4 S2 s3 p- l( I( q' J# w
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    * P. W" J) {1 l. a
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    9 V& @" m1 `" U2 J  `% D5 g5 a
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)( {! M: r4 ^) d% k) j% h' M
  235.         BookConte = BookConte4.replace("\n\n","<br>")3 ?* ]' M8 \% m+ X! o
  236.         print BookConte
    & S' Q8 I  R' [, W3 c. G
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    # ^4 ~2 l& s0 o) h7 }4 S7 x( T# A8 Y" V. j# ~
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)( E7 M# a9 Q/ S- B) j: Y
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    . I# y# E- W* N+ n6 h% S7 {
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4), d& W% a# g% p! c4 A" J
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    " x! L# C5 Z% f; s7 x
  242.         Book_img = response.save['img'],  #小说图片6 c$ L. a6 x1 j: ?4 \
  243.              8 i  \  o( W. K, |) U
  244.         #insert into MySQL 小说入库
      l5 S5 ~+ c. Z, Z" Y
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布- W$ C/ B. d  @( l. B. Z
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布3 j# ^! u* f+ y) g8 p( R
  247.         #post提交发布
    % @$ g0 w- }/ Y. U0 C
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    $ m3 U1 l& ?' v7 s7 z* i" \
  249.         Datos = {
    0 k! U) A$ `9 N  x# {! m: y  W
  250.                   "Cater_Name":response.save['Cater_Name'],9 e) N8 j: m! }1 d
  251.                    "Book_author":response.save['Book_author'],
    ; k* R) A  D) ?6 d$ I" v
  252.                    "Book_Introduction":response.save['Book_Introduction'],' k( o& `  i5 w+ J7 B! `* j
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],& \& p- N/ [4 A9 U' r
  254.                    "Book_Palabras":response.save['Book_Palabras'],/ j4 C  F, l, R3 i/ f# Y! o
  255.                    "img":response.save['img'],
    + a$ P8 E9 O$ O* s; Y0 [& ^
  256.                      }4 E, Q- J; l) Y0 R, A2 t
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    7 N/ u7 S, d% |; K2 T
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ' Q/ T' l! f5 S$ G0 {) [7 `. z
  259.         return {2 G4 x& E  B5 C; }: P: M9 y+ X
  260.             "Cater_Name":Cater_Name,$ I6 H$ w; c1 q. q1 o4 N' U3 X7 x) w3 [
  261.             "Bookname":Bookname,
    8 N% o2 {% w: u9 p6 d! R
  262.             "Book_author":Book_author,
    3 W6 u+ N' h: ^1 R4 ~
  263.             "Book_Introduction":Book_Introduction,# i$ k+ _% j3 J+ z
  264.             "Book_Synopsis":Book_Synopsis,; J1 u- r8 y; p1 U9 t4 r, T
  265.             "Book_Palabras":Book_Palabras," t# l0 S6 ?6 _) s/ M& w
  266.             "Book_img":Book_img,
    ; q( C1 \& m6 w3 @' w
  267.             "Bookurl": response.url,$ S# I5 j5 t( s' @
  268.             "Booktitle": Booktitle,
    3 R4 i1 x" C: t
  269.             "BookID": BookID,7 H4 e/ c9 j5 }% [6 n) Y9 ]$ h! k
  270.             "BookConte": BookConte,4 ~# k! q9 @  M. f8 r% S1 O
  271.             "Titleid": Titleid,
    . q0 O- a( `: k* d; l1 j8 c
  272.             "abover":abover,
    ) P- `: u$ o. }) ~* b
  273. #            "Book_Date" = str(datetime.datetime.now()),
    * g/ }4 I3 T1 }5 j; u
  274.         }
    - B5 P7 F1 |) U8 n7 ~
  275.     def download(self, P_dir, imgDir, file_name, Book_img):6 p( j4 [+ `( C  O+ n. d
  276.         if not os.path.exists(imgDir): ; A: ^# k5 x0 K! O6 ^
  277.             os.makedirs(imgDir)
    5 Z: t" n9 w0 f# n* u7 G5 S7 }9 r
  278.         file = imgDir + "/" + file_name( @& ]) I9 j- m, z1 c' K6 b
  279. #        print file
    ; [6 ?: L9 b; u- v1 h# \, i
  280.         f = open(file, 'wb+')
    ! ?1 Z6 j7 v0 j2 q3 R( q6 l+ x3 ]( \
  281.         imag = requests.get(Book_img) 1 L( ]7 i) M  t; K( M
  282.         f.write(imag.content)8 t# r; x7 Z) q% `6 @5 ]
  283.         f.close()' x" E& Z3 Q+ l9 v; R% M' y3 t: [
  284.         #保存图片前6 j* \- f- x: B, S5 \% m
  285.     def save_imgs(self,response):0 O8 O# V, g2 W5 {% G" I2 Y
  286.         content = response.content* Y6 c" b, J* o
  287.         file_name = response.save["file_name"]
    ) \# B! X1 ]/ J; h' v$ f7 R
  288.         imgDir = response.save["imgDir"]+ V2 v' G0 H  v( y, D1 c+ o
  289.         file_path = imgDir + file_name2 b7 H$ c7 F! W
  290.         self.save_img(content,imgDir,file_path)+ Z5 N* ?( }* k$ C
  291.     #保存图片
    2 o- W$ {2 h+ c( ?3 _$ x, h$ l
  292.     def save_img(self,content,imgDir,path):1 z0 G& t8 P! I7 c  d2 s
  293.         if not os.path.exists(imgDir):                         % e$ c4 k5 e1 `1 V, z) p$ e
  294.             os.makedirs(imgDir)
    ' p  c$ F, v5 E) k2 @, r  g
  295.         f = open(path,"wb" )
    " S8 Q' s7 F2 N" C5 S
  296.         f.write(content)1 ]; }* S$ e5 @" Q$ F: Y8 d  h% e
  297.         f.close()3 u* J  e" i& o7 E
  298.     #获取url后缀名1 I  T( h7 a" o0 @+ x
  299.     def getExtension(self,url):                            % k& i5 V, x! Z
  300.         extension = url.split(".")[-1]
    ' P0 r0 e0 h4 q) i1 S
  301.         return extension * L3 P  B* m1 h0 y4 A$ ^
  302.    
      p* t" J$ G9 S' J# `5 Y6 Y4 O
  303.     #获取图片名
    : W0 K  x$ T7 V: X5 [$ j% m' l- G
  304.     def getname(self,url):
    $ i& `2 Z+ A! j7 n/ B9 p
  305.         name=url.split("/")[-1].split(".")[0]
    + C& J/ Q0 a; b
  306.         return name
复制代码
" M' ?4 F+ O* @$ k( b) s: r

, [0 M2 B' Q8 Z, C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-4-14 13:55

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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