找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
6 M! o$ K9 P' x3 D0 v
  1. #!/usr/bin/env python( v7 {3 @  V( x! t0 A
  2. # -*- encoding: utf-8 -*-/ i' a2 z/ D" r; t/ p' b0 q6 S
  3. # Created on 2019-05-05 21:43:11
    3 G- _) V" z# m/ y9 T
  4. # Project: XiaoShuo
    6 e7 L% ?$ n" v6 |2 c8 F  `7 t7 \8 @
  5. # Y# d8 M7 F+ U: S+ d9 @
  6. from pyspider.libs.base_handler import *; z1 R( K8 @; W* ?9 O
  7. import pymysql
    & Z- C2 p/ l. L; O- M
  8. import random& v) ]2 R7 |. R: s1 a+ x- O( V& k
  9. import datetime
      o9 R( O: I' b' {; ~
  10. import urllib2,HTMLParser,re) l7 k6 Y3 P% ]. k
  11. import os( `, K- \& C9 W! _
  12. import sys
    $ D+ `! {+ g7 x) s& U- a* d1 Q
  13. import re
    # e7 @! z7 X: {+ g' z5 t4 U
  14. import codecs
    ( T  @; [# o* I! e5 j$ ?) K- G/ g
  15. import requests
    ! u1 m3 N! H* i# y
  16. import json
    * o4 o* z7 |; k+ ], B/ }
  17. : T' q# }% |8 _: m, _9 X1 m* b
  18. class Handler(BaseHandler):, O' u, g' g- A" o& u% n% R
  19.     global Datos7 n# `% M1 g' h7 @0 X% w
  20.     global P_dir    3 B4 r4 w; ]8 `: @- W8 Q
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    5 }6 C9 `5 b" h( u/ x+ r1 ~
  22.     global Datos
    + n' v9 [7 F# p  Y0 z* i& c% e, U
  23.     Datos = {}0 L  x3 y! G9 ~
  24.     headers= {
    - \9 C0 Y' j1 |2 @. t$ e6 ?6 ]! l
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',, ?! l" o  r$ p* i; x0 a0 |# i/ D
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    ! n5 S9 i1 X$ Z9 }' R! O2 u
  27.     'Accept-Language':'zh-CN,zh;q=0.8',2 @6 L( e1 |/ Y7 C& M' e$ R
  28.     'Cache-Control':'max-age=0',/ ]) W. f+ v6 V6 I
  29.     'Connection':'keep-alive',( N& R. g. Q' }
  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% y' m8 {: \
  31.     }6 H4 ?2 H& ^3 D- v- ]; c
  32.     crawl_config = {
    ' i) C3 m$ C; \- _
  33.         'headers' : headers," |* ^1 B/ j9 P
  34.         'timeout' : 300& S/ \# |8 |4 X% t4 ]# ]
  35.     }$ n( I: @/ n. p* L$ K
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):, G) h0 P/ j3 Y! p& \
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    / c, s* S8 i1 Q0 E5 R' ~4 e
  38.         try:$ [! p; s% T9 E) P
  39.             cursor = db.cursor()
    $ b9 ^" K5 v* Z$ p1 E, U, Q
  40.             #注意此处字符串的占位符要加双引号"%s"
    2 x0 x% k# s. y. N* Z
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    - V/ w( |4 U- ^7 h# y
  42. #            print(sql)9 X5 N; b  _# ~. ?# Y. q# z1 r
  43.             cursor.execute(sql)
    8 j6 a* T' z4 N: ^5 u; T/ P
  44.             $ j' s* C3 `' h6 Z$ w9 d3 ]1 y
  45.             #qid = cursor.lastrowid6 ]0 E/ a5 \8 ]0 p
  46.             #print(qid)
    ; o& o' a6 s  f4 m  N" n( p
  47.             ) `5 b/ [$ s* ^  Z6 |9 d$ [$ f7 p
  48.             db.commit()
    $ r3 i$ V6 A; S- E/ y, L
  49.         except Exception as err:
    8 K2 s6 A/ a9 n1 x$ l3 p
  50.             print("Error %s for execute sql: %s" % (err, sql))
    . k6 \5 @" S* h+ }6 b9 b1 j" V
  51.             db.rollback()/ P& f. D1 m, W6 r3 P
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    3 ^& J$ n5 D5 f( g+ R
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")! P/ E& l, _9 e; K) x% C6 l
  54.         try:5 f, D2 U3 `  U1 C: I
  55.             cursor = db.cursor()
    / f5 o% h. ^  A7 |: n, i, Z  v
  56.             #注意此处字符串的占位符要加双引号"%s"' t5 \+ c- v* m8 Z2 q
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    4 ]3 A# z, ?$ h! ~0 \9 ?# Z4 k
  58. #            print(sql)
    9 H4 c! k* r( C+ S* j
  59.             cursor.execute(sql)
    7 ~% r) _& Q) l
  60.             + t7 K6 N* J0 `* O& w! ^+ Z# M
  61.             #qid = cursor.lastrowid. ^5 p2 l' c. K( i( @' W
  62.             #print(qid)
    9 ]1 G- r. Y! b$ y# ~; H; H, u/ n+ V
  63.             0 z# M7 }$ Z# J& L6 C8 @
  64.             db.commit()
    + S5 P: ?1 R( M  Q" L. ?2 G
  65.         except Exception as err:
    0 G& T( g% e6 {/ v" E- o; p
  66.             print("Error %s for execute sql: %s" % (err, sql))! s& d* u4 ~& q0 ~( _0 z( C7 i
  67.             db.rollback()
    # {1 @0 ]& z% j0 z2 A9 }1 U/ C
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):* i+ N2 R* G1 f; o. G. H0 a
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"): m5 u6 O: ?: [( P6 ^( N
  70.         try:: P, z3 c' i6 k- E6 D% l
  71.             cursor = db.cursor()- n: l  S$ `2 Z# F  e6 N
  72.             #注意此处字符串的占位符要加双引号"%s"
    ) q2 B8 t4 B% {) C
  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);
    ) |5 p  b% L1 b6 {) s
  74.             print(sql)
    % [/ @& c# b( u
  75.             cursor.execute(sql)/ y6 K+ Y# E3 B0 U& x+ H; h
  76.             print(cursor.lastrowid)! C" @7 P0 y. j
  77.             db.commit()
    5 I9 W% s8 o8 d! g* Z- F' }5 z
  78.         except Exception as err:# h. s8 G/ P" }2 D: O" H. _
  79. #        except:
    " V& s- V; n) K
  80. #            print('Failed')
    * T3 _/ B- v6 ?( ?) s
  81.             print("Error %s for execute sql: %s" % (err, sql))
    / A: c* Y; K8 a. x$ G
  82.             db.rollback()8 C" K) }. X' q, S1 d
  83.         
    ) S( u4 K5 n2 F; R/ T# x
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): 7 B. I5 x3 i+ x
  85.             reload(sys)
    3 O, l3 {9 V7 |
  86.             sys.setdefaultencoding("gbk")$ ?8 J5 P8 L+ U' ]
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    ( K, h5 w* S: o  b3 u: {, L+ H
  88.             locoy_data = {5 b& m4 L. O1 W- z# a* D5 {- W* D) D
  89.             'my_u':'用户名',   #后台用户名  A, v: m5 ~2 m1 @# h( a
  90.             'my_p':'密码',   #后台密码, [0 W! m0 V* p- i. V* E/ [. D
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    ! A! g# l( R/ L" x; C- y$ ~8 j
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),! s' X  T  _" u' [. _% e  j( T
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    6 c) {; v0 }# a
  94.             'article':BookConte.encode('gbk', 'ignore'),& L4 [* j$ q/ Z) z2 B( i
  95.             'author':Book_author.encode('gbk', 'ignore'),4 K, w& }5 d6 @% X, F
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    3 v9 C- Q8 ]& o2 n4 T9 B7 c5 X* d
  97.             'thumb':Book_img,
    # z  I( L7 Q" D8 }
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    ) `0 ^$ P- U, M" p- Y
  99.             'abover':abover.encode('gbk', 'ignore')           : `2 y: W% _" _, p. W& `
  100.                 }5 \0 o9 N6 _4 D# b
  101.             res = requests.post(locoy_url, data=locoy_data)* N/ Y0 c, G! i/ g8 |
  102.             print res.text; Y  w$ D) o+ U7 k9 F6 c- F
  103.             print res.content* x& l* x8 @1 ?
  104. #            print Dsd' g6 y9 ~% h. {/ M, w
  105.             return res
    % g' {1 i5 d; c2 B
  106.     . i0 p3 h0 A6 Y$ D( @; |) p
  107.     def __init__(self):
    4 m2 ~0 c2 N1 Q4 z/ a4 M
  108.         self.base_url1 = 'https://www.****.cc/'4 O- G5 R3 _! d* L
  109.         self.base_url2 = '/'4 N4 a( U" y2 F2 V% s
  110.         self.CaterId = []
    3 h2 y5 _: c% H
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']0 B9 ]  d. B# t" z4 n& z
  112.         self.page_num = 1
    3 _/ Q8 d0 C7 U
  113.         self.total_num = 200   ( j. B* l0 ?2 T/ L0 D
  114. 0 @8 _! O6 A$ ~3 N7 @
  115.     @every(minutes=8 * 60)
    - F' ~3 {0 V) l
  116.     def on_start(self):
    ; X6 P' D1 {) E% b" d
  117.         global Cater_Name
    ' q3 u- o* f& }, K) v1 |1 v6 \1 [
  118.         Cater_Name = []
    6 r& b5 |$ M. q- K7 X: E6 L4 j; o
  119.         while self.page_num <= self.total_num: 0 K5 {7 ]% W3 T+ G
  120.             for self.CaterId in self.CaterIds:
    ) U; ]& a/ m; e$ r; }$ R7 [3 M
  121.                 if self.CaterId  == 'xuanhuan':# X8 Y% X8 d8 c2 z
  122.                      Cater_Name = '玄幻'* l+ l  a) j* A8 O
  123.                 if self.CaterId  == 'wuxia':
    ! ?6 p& j6 r* p& Q
  124.                     Cater_Name = '武侠'
    3 x' V6 I+ @. b( }2 H; u- ~+ f6 w# G
  125.                 if self.CaterId  == 'lishi':- a) s% c: z- V( P0 G% @% Z
  126.                     Cater_Name = '历史'            % ?9 q' [& f& O# L3 E9 i
  127.                 if self.CaterId  == 'yanqing':, ~9 Y9 t' l8 e& u
  128.                     Cater_Name = '都市' % w7 ?+ r( y6 t5 ^
  129.                 if self.CaterId  == 'nvsheng':
    1 U7 a5 D5 z" I7 M; i: ?) u& q' R
  130.                     Cater_Name = '都市' 4 N' l0 C( W( f
  131.                 if self.CaterId  == 'kehuan':
    : x5 c# J" c& L0 @& Y8 s$ p
  132.                     Cater_Name = '科幻'
    # `# w1 @- ]( {9 M* l1 f
  133.                 if self.CaterId  == 'kongbu':9 ?" s3 ?. J. l. q3 {# f
  134.                     Cater_Name = '游戏' 3 h/ S/ J! i( P1 |# f: `( z. F
  135.                 print self.CaterId' X. ~( N7 T0 V$ X2 V- l: X8 k
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          & T; r# ^( c3 k! I  \
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)& u5 P. x) B2 f
  138.             self.page_num += 1
    . f1 M$ c2 {. E6 O) `# r
  139.             5 v) m6 k. @5 @. C  N
  140.     def list_Caterg(self, response):
    9 w' t: O7 r4 G7 E
  141.         Cater_Name = response.save, i6 y! @" o# t4 Q2 Z: X9 Q+ r$ ~
  142.         for each in response.doc('.pic-list a[href^="http"]').items():' b7 x. q* Q. L+ K! g$ H
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    . u, v/ b: S& c( x
  144.             
    ) B1 n& c5 b9 V+ W8 V# ?7 x) a" S) K
  145.     def list_Caterg_detail(self, response):
    6 G" f( E; g' F; J! X6 B
  146.         Cater_Name = response.save
    * E0 F' f8 S  P, _' w1 F
  147. #        print Cater_Name! b7 l' \6 K& S
  148.         Bookname = response.doc('h1').text()
    2 @. ]4 V4 Y- X
  149.         print Bookname5 h2 d; _7 f% @' b3 x+ Z/ y
  150.         Book_author = response.doc('.authorname > a').text()4 m! w" D" G2 B! J
  151. #        print Book_author
    $ T0 Z- B" {- C  ^( H6 ?- s
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    , Z" I% b# j+ ?7 Z* v* ?
  153. #        print Book_Introduction
      e, R) U6 L8 z( k: ~
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    . O# s7 ?, x) t) |! ?
  155. #        print Book_Synopsis
    7 U" |) Y. F& i% W, D/ o- [6 j
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    , `, }9 u) K% }
  157. #        print Book_Palabras
    : z; I9 X8 R8 |/ h- o
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID, X+ G  w1 x- \) |0 s1 t
  159. #        print BookIDs1 W  N0 h* H9 c) R
  160.         Book_Dates = str(datetime.datetime.now())         & I, `! z6 ~: K3 I! f
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():0 r* h2 ?: Z% \5 z& {  @  ^
  162.             img = imgs.attr.src
    4 f& O0 ?0 I# F5 s( v
  163.             print img
    7 s9 ?+ h0 e! a. v; @" Y6 v9 o2 h
  164.                 #小说封面下载
    " o; |+ H; I* _3 d' |- q- S
  165.             extension = self.getExtension(img)7 |5 H# s7 f  C- _, A+ t8 ^' H
  166.             name = self.getname(img)
      P' N  s, N: x& R2 R
  167.             file_name = name + "." + extension
    3 @4 }' y' V  `' V: a% s5 R
  168.             imgDir = P_dir + name
    + ?; d  `6 h; ~, w& q% t
  169.             Locaimg = imgDir + "/" + file_name
    5 ~9 n. s7 Z6 \
  170.             print Locaimg) D" W! F2 X- u5 T
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地& V3 L" R0 {8 d9 X# O
  172.                 print('attachment url is ' + img)               #
    $ `# s( S* h9 n1 |
  173.             Datos = {
    9 M% U/ T( E$ F# p; `& ~
  174.                     "Cater_Name":Cater_Name,
    , {- l3 z- u" |( N3 O. _
  175.                     "Book_author":Book_author,
    : {5 p  k: y& I) T' T
  176.                     "Book_Introduction":Book_Introduction,
    ! x$ w0 J1 Y; S8 O
  177.                     "Book_Synopsis":Book_Synopsis,
    # y' q$ k5 b4 Z2 Z1 N- y
  178.                     "Book_Palabras":Book_Palabras,0 r  `) b/ l" B' P/ j4 r
  179.                     "img":img,# O* Q& {& M! K  l$ W" D
  180.                 }
    - ?3 ?* ~! |9 G
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布& A& U1 S0 j& `0 Q
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():5 s3 I4 V/ J# A  |3 M
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)' g, w/ V9 Z1 b
  184.             
    " [6 X3 M1 T8 M6 Z6 f3 L; i
  185.     @config(age=8 * 60 * 60)   
      o. w" Y! J# ^  b* T" l
  186.     def index_page(self, response):
    - }9 z$ r+ w) X9 }5 L" l& V9 c7 _
  187.         Datos = {) r0 r9 H3 ?( k$ I8 P0 I3 _; R
  188.                   "Cater_Name":response.save['Cater_Name'],; K1 ]4 l$ m5 a! m9 x
  189.                    "Book_author":response.save['Book_author'],# [# B: ~3 W: D$ w: X  [
  190.                    "Book_Introduction":response.save['Book_Introduction'],# v* P& g( C( h7 Q9 E+ a3 F
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],% K0 v; S2 Z: g( W" w
  192.                    "Book_Palabras":response.save['Book_Palabras'],3 c* o: z! n, N# _; f4 f. d
  193.                    "img":response.save['img'],
    / P9 R( R( ]; X
  194.                      }
    % ?) e. \$ W3 ]3 s$ W6 g" f1 [
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():" p) @7 B' ^9 X; X/ v
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  ( T% q5 f4 D7 N) h1 x
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos). Z: n. v1 }) z+ j6 |& F# `
  198.     @config(priority=2)1 K1 J7 f- m) K: x4 P7 h
  199.     @catch_status_code_error2 Y; o+ Q4 d! p6 ^
  200.     def detail_page(self, response):        
    ( D& |% a8 c) A( p- M8 P6 M
  201.         NewRe1 = u'哈书'& y8 ^6 I! V( C  Z0 r  J
  202.         NewRe2 = u'huhjsd.CC'6 B6 v/ _& N, f7 o9 |6 E" `' h
  203.         NewRe3 = r'^\\n\\n'
      G- Q1 Y, ^1 S! y8 a7 J
  204.         NewRe5 = u'小说网'; f) Q, g- }* y* g6 b
  205.         NewRe6 = u'fgdfgf'
    1 X( X  H* E& \7 C. y8 w
  206.         NewRe7 = u'fgfgf'
    ; G0 G/ _( b! J" c. ~7 J: _9 x
  207.         NewRe8 = u'ffhgf': I5 F7 G2 x  l1 }2 x) o4 w
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'9 q8 I9 x9 T% H' i* G8 Z
  209.         ReC1 = u'静思'
    2 B% f4 S3 w! j
  210.         ReC2 = u'aghgf.com'
    / R- P) q+ A; n( j$ i4 L6 P  I
  211.         ReC3 = u'aghgfh.com'# s4 n: D8 T7 V" f1 e. {$ T
  212.         ReC4 = u''9 q: a) p- U' l  ^) V+ H
  213.         ReC5 = u'文学网'
    * Q6 p( [9 i$ M3 ?7 V0 j9 A
  214.         ReC6 = r'<BR>'" _# i2 L( v. h
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    4 S, I5 r/ u% b; i. D, d
  216.         print Bookname
    , x; a$ Y2 Q  _5 Y
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类8 G, o* E5 C5 q6 [. u  P: C
  218.         Book_author = response.save['Book_author']   #小说作者1 R9 q% D+ V1 L+ y: D$ O' h3 H
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    " K5 \) M& D3 d) i/ R
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新- \& h7 E9 B- K+ B
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数; z1 @& f8 Z# T6 Z! z% u
  222.         Bookurl = response.url   #小说网址2 o6 G0 v1 N7 P$ M6 b
  223.         Booktitle = response.doc('.article-title').text()   #章节名称9 L- H. U' `! Y- x+ Y) `  r  i
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    1 w. k. r( V9 e# b% w5 M
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容- y0 V7 o" L2 y) {( ~6 H
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    / o5 ^0 V- x6 F
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间  \' v" g! r+ Y" U& q* D
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    9 Q3 j- U& _6 B( C
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)8 a& \( R  u0 q' u8 r$ q
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    * a6 A$ v* J: ^# @+ v; s7 V( s
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    1 o! M& h( ?& W% q9 B! U, r! K* O
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)) @9 {9 j) O, P) g7 ^+ ]
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    7 [$ a+ p" S7 J; Q
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    6 q3 g* O" z: z! }& O
  235.         BookConte = BookConte4.replace("\n\n","<br>")/ x1 F4 A# A+ U4 t3 b6 u& S/ E+ F
  236.         print BookConte
    ! o  A/ N! }. Y  Q
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)$ x0 E* O# ]* y9 q9 J1 ^& [
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    3 Y: w5 R+ j8 E9 P! C: p2 a
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    7 a4 D4 b) ]0 o) }: e/ t
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
      {5 P" h: y6 c
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     ; [) b3 M# w: @) a. U0 O/ H
  242.         Book_img = response.save['img'],  #小说图片' \+ V" r% E$ p# p( [3 k3 Y
  243.             
    ) x* L; d! V7 S  N
  244.         #insert into MySQL 小说入库
    ' m3 R4 z5 p# w
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    7 Z( q# H9 ]- S2 _# I$ y% D$ B9 r
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    % b0 `4 J3 W  G! _2 g2 V; ^
  247.         #post提交发布
    . L0 G' w  U) |2 U: G
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消2 {7 x4 M% _. @: _4 }  T
  249.         Datos = {
    3 F2 m* Q4 t/ r  D
  250.                   "Cater_Name":response.save['Cater_Name'],0 Z, P" }7 O& d# v- Y7 O+ b( H9 t
  251.                    "Book_author":response.save['Book_author'],8 [2 @6 Q, F/ S& B! n
  252.                    "Book_Introduction":response.save['Book_Introduction'],8 l. O' C6 I( z. }7 d
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],8 e% C. i1 X1 ~* @4 Y  ^
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    ) B% a: w* z( w  \8 W% ?" p! O
  255.                    "img":response.save['img'],
    . d/ b9 d2 y& a1 A0 [4 y; T0 h% @/ ?( _
  256.                      }, X5 e' _$ a$ m* {1 w  ?; T( T
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():4 G% O$ b! ~  k
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ; X  u0 N5 R+ ~7 x  U# n
  259.         return {
    5 G* a: g' D3 u6 \7 K6 k
  260.             "Cater_Name":Cater_Name,- j7 g8 I: Q6 ~( d0 F" {# Z
  261.             "Bookname":Bookname,
    % ]+ Y3 K. Q- l
  262.             "Book_author":Book_author,
    2 q- a0 Y- s$ O3 \8 l" q& K( `
  263.             "Book_Introduction":Book_Introduction,
    9 X) C1 N- s  M/ }3 A# `
  264.             "Book_Synopsis":Book_Synopsis,5 s9 I7 D5 M  }) B" x
  265.             "Book_Palabras":Book_Palabras,
    $ i' g& d/ F+ ^
  266.             "Book_img":Book_img,
    ! t3 S; n: J$ |- k, ~
  267.             "Bookurl": response.url,$ J" h! R5 x1 r% ?& Y6 P
  268.             "Booktitle": Booktitle,1 U/ }1 b& x6 e3 H3 D4 C/ x! m; O
  269.             "BookID": BookID,& r4 X1 {( A8 Q9 h
  270.             "BookConte": BookConte,
    $ I5 U1 [: T4 ^7 f7 G" }2 g6 G
  271.             "Titleid": Titleid,+ V" W8 P: R- F+ m: Z% ~" v
  272.             "abover":abover,% t. o, ]5 a. c# `6 {; Y
  273. #            "Book_Date" = str(datetime.datetime.now()),
    ' G* y% I$ B# Q4 F1 A: y7 N8 ~( o$ G3 `
  274.         }( Q* W/ A1 C! L% h7 a
  275.     def download(self, P_dir, imgDir, file_name, Book_img):  ?' s2 q5 R0 y4 M. ~: ?$ `
  276.         if not os.path.exists(imgDir):
    9 U7 j1 ^. Q' \6 Q) x* Y
  277.             os.makedirs(imgDir)
    % o: G: x0 q& O3 h: o' ?: \+ ?
  278.         file = imgDir + "/" + file_name
    . z  l# c; G8 \1 Z) n  d' u, E  R
  279. #        print file
    ( {. S3 o5 @$ t2 |9 W5 ]2 T* s
  280.         f = open(file, 'wb+')
    0 r& K. c' Y9 ]! o8 @/ t
  281.         imag = requests.get(Book_img)
    8 @1 S  r9 p; |  G: Z% J# ]4 V
  282.         f.write(imag.content): E! s" o3 }2 }: }, |# L, a$ O
  283.         f.close()
    4 r; s) ^7 P  K; L) z
  284.         #保存图片前
    ; d8 ]1 L- h  m# I$ c* G0 |9 m
  285.     def save_imgs(self,response):1 Q, B  d0 }/ i) D( A6 F
  286.         content = response.content8 U$ S6 Y+ s  a0 b1 b
  287.         file_name = response.save["file_name"]
    - p4 p- E; m+ h' j
  288.         imgDir = response.save["imgDir"]
    , y% x6 ]; J) i5 Y# d/ {+ j
  289.         file_path = imgDir + file_name# m- d1 ^' b2 N- e; C; `) ]$ V
  290.         self.save_img(content,imgDir,file_path)1 Q* P4 R& S  F- r
  291.     #保存图片/ O. z/ J8 k. U. p
  292.     def save_img(self,content,imgDir,path):: }; Q. L7 Y, n+ ~, k8 J7 f' I
  293.         if not os.path.exists(imgDir):                         2 S/ |/ N0 \! _* a' w
  294.             os.makedirs(imgDir)$ x( p0 W7 v, @: K8 |) M
  295.         f = open(path,"wb" )- _7 W3 a( _% j2 `
  296.         f.write(content). j( a( B. r9 f# ~, G7 S5 ~8 ]# @6 @
  297.         f.close()
    ' _7 C. f; G5 Q! z( d
  298.     #获取url后缀名# X; [/ V6 }( v1 C6 n9 m: \
  299.     def getExtension(self,url):                           
    * {* I- N$ L' P' W& O: B0 Z0 y
  300.         extension = url.split(".")[-1]4 u! {9 m8 U$ z, k' l
  301.         return extension
    : i, P! \4 ]8 G% o: ]4 ~: W9 a% I
  302.    
    ; w' b$ n; x; Q4 u. b
  303.     #获取图片名. g2 l7 G5 v' ]. N3 |' {) J% p
  304.     def getname(self,url):0 U$ x# @& K* ?2 @% y9 k
  305.         name=url.split("/")[-1].split(".")[0]
    ; Q1 v0 e" F$ Z3 T* l& B
  306.         return name
复制代码

7 j/ c" R# X0 M& b
- Q9 C, O! k& {8 u( M. |& t! H
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-9-12 22:45

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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