找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!6 l* {6 p! F. G& O- M. O. ^
  1. #!/usr/bin/env python
    ' D. u$ j! q  I) p7 }
  2. # -*- encoding: utf-8 -*-; N* V; T: E5 \8 U2 `. R8 \8 {
  3. # Created on 2019-05-05 21:43:11
    , H( k1 k0 u; h
  4. # Project: XiaoShuo
    . U3 X& K1 ?; I+ ]1 H/ b% I
  5. 2 ^% {6 E; V* F5 F1 K' R
  6. from pyspider.libs.base_handler import *6 Q" O0 O, Z& l3 _2 H
  7. import pymysql
    % |- ^4 g0 D" B) [
  8. import random
    # l5 k: x0 w* w1 Y' F2 H" e$ K: J
  9. import datetime2 e$ K1 A$ f. m  M) K
  10. import urllib2,HTMLParser,re
    7 e/ k3 h' V# V: p9 l
  11. import os
    - {9 E- [9 I( y
  12. import sys8 z; _! k% i$ T: R4 z
  13. import re- O# M+ m# K. j; I" `! ?
  14. import codecs
    8 L/ j; Z8 T6 O; {8 L
  15. import requests
    7 G- t/ E/ v& ^& V" ^
  16. import json
    1 Y: ~6 c6 ]; Y) ~

  17. 9 m8 e/ U; F. Y3 M8 |8 q6 K/ z
  18. class Handler(BaseHandler):1 w# N4 @& ^- E& }0 ^$ }0 s
  19.     global Datos( Y8 e0 J7 s) X6 U% @, l5 t2 t& W
  20.     global P_dir   
    9 I- R* [( Q# b2 H) }  r% T& U
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径  s7 Z, `7 [3 r
  22.     global Datos
    + x/ m  E- G, ~6 X
  23.     Datos = {}
    ; b: b. n- H7 _" V, q0 ^5 o, y
  24.     headers= {4 a- V+ |% x- s9 v; ^3 g  c
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    1 ?8 L0 [6 g) E1 F; s
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    3 \5 @& u7 a5 ^1 H* y1 h
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    6 m- z# X; a  J% a9 m5 v* ]5 j! d) i4 {
  28.     'Cache-Control':'max-age=0',
    # f, j1 I2 U) w& ^5 K" H0 W* x' ]
  29.     'Connection':'keep-alive',
    : D; p  e+ B( _
  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', z( Z& r6 l0 ?( Q2 C6 C! `( D. s! Y: a
  31.     }
    3 C& J% ^! f% u, P! [" J) T$ l8 h+ ]
  32.     crawl_config = {
    $ ?* G" E7 K7 m8 W) w2 v1 w
  33.         'headers' : headers,( B- j3 y' u3 D0 g
  34.         'timeout' : 3003 k" H4 g4 O; l
  35.     }
    : H5 _  _* M. {7 a1 n2 F" Q: Q, p$ R
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    5 C- ]: N8 }5 T/ K6 g7 j
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ' n0 D( H/ N: [+ w! @$ M2 S7 D
  38.         try:4 B1 V, J. @  L
  39.             cursor = db.cursor()
    1 D3 W5 H! [: ?9 {7 S  s0 ?
  40.             #注意此处字符串的占位符要加双引号"%s"" M: d' E' l9 D* Q9 T2 x; I
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    ! z# G" u5 U1 c' U* h" A, ~* u
  42. #            print(sql)
    + u5 O  H5 Y) r4 ^1 N2 c3 i
  43.             cursor.execute(sql)
    * h5 ]" [! R0 _! H4 N4 |/ t
  44.             ; V. B/ W: f% S3 u0 A' H1 z
  45.             #qid = cursor.lastrowid. K5 \! @+ h3 q" p8 b
  46.             #print(qid)0 b0 h3 m* R* N
  47.             " h8 C/ C4 ^& `) i9 Y7 w! [
  48.             db.commit()5 M: h6 M, W$ {" p. H  v
  49.         except Exception as err:
    % A5 Z8 {' Y5 I4 d& v
  50.             print("Error %s for execute sql: %s" % (err, sql))! `+ m, m" R9 e
  51.             db.rollback()3 N. G- @! g: c4 t( w
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):; K* ?8 f; M9 H' s! r  G; s
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")+ z& b( D" T" x! H$ A+ X
  54.         try:
    7 z  X* Z" @6 _8 a3 q
  55.             cursor = db.cursor(); x: s1 e# I! N7 u3 ^
  56.             #注意此处字符串的占位符要加双引号"%s"
    5 S" ?" u. _: m* u+ ]# F3 _: g
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    6 }; K) K% {* ~
  58. #            print(sql)
    ' M* r. g/ n3 Z9 ?  D% ^/ C  b; y
  59.             cursor.execute(sql)
    7 |- |# j+ b3 x6 i& O+ s) O3 A
  60.             
    ; x3 t# O; C5 O" [# P+ k) W
  61.             #qid = cursor.lastrowid5 E  c- \2 k. J2 P
  62.             #print(qid)' v4 T) @0 X) k1 O- l8 F# |. p! W
  63.             , m: G3 P7 h& J3 b8 P$ M0 z
  64.             db.commit()
    / ^, [4 d0 f6 r9 O
  65.         except Exception as err:
    ) O0 @( y# V) \0 U1 K  l$ Z9 g
  66.             print("Error %s for execute sql: %s" % (err, sql))
    & s3 x& @4 y: t1 I0 K
  67.             db.rollback()4 c" Q+ Z2 b! y: @5 L
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):, E* e  `, J8 m5 K" b
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    " x$ F' T$ L0 x. U5 k% P! Z
  70.         try:- B  U$ |( o5 I* C4 q
  71.             cursor = db.cursor()
    1 a# a3 U4 W" `$ z3 u
  72.             #注意此处字符串的占位符要加双引号"%s": e2 N$ ^) I: ~& u& K( D6 R
  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);
    / O+ I  d7 F9 {: ^" j6 S/ j
  74.             print(sql)
    $ A- F3 N% t; b" k# t& T- Q) |
  75.             cursor.execute(sql)
    ( l% J1 z* s9 f1 b+ F- O
  76.             print(cursor.lastrowid)5 y+ L' S; R- M/ L
  77.             db.commit(); |$ J9 s6 J% |
  78.         except Exception as err:& Y" {& s! M2 `
  79. #        except:
    ( V9 v7 }+ X& I* j
  80. #            print('Failed')
    ' P6 o  V- q; ^. D7 @; m4 l' }
  81.             print("Error %s for execute sql: %s" % (err, sql))
    : N' [0 Z" _( o1 u+ z% E- T: g4 q
  82.             db.rollback(): |/ z- M! M$ }- k
  83.         
    / g6 C& F( v& c( l9 `; s" @- f
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    % P# S# n$ I# x  R* l
  85.             reload(sys)( b- a* F9 U% r5 a
  86.             sys.setdefaultencoding("gbk")  I! ^  h, ]2 k/ q$ k% V
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址0 Q9 a! F# u2 |; R# p
  88.             locoy_data = {) f: p* P) R  B: S7 o( M
  89.             'my_u':'用户名',   #后台用户名
    6 _+ X) j1 W: F% V& L# h5 h- @
  90.             'my_p':'密码',   #后台密码
    6 Y! C" W7 T% I# h. Q
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    6 f" V& A, A9 [( W# n. e9 e: V2 g
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    # U: R3 t2 C3 V9 U+ S4 x
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),& X! _! Z# ]5 E5 D
  94.             'article':BookConte.encode('gbk', 'ignore'),
    1 X6 X' z7 Y# B* Z- P) Z  h
  95.             'author':Book_author.encode('gbk', 'ignore'),
    6 i( U( [! i& V; }; ^4 S
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    2 @! Y; J7 x/ j9 b: }8 w" T
  97.             'thumb':Book_img,
    - a/ _0 C7 [0 Z1 b
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),5 d# a! L$ F8 a  p9 y7 \
  99.             'abover':abover.encode('gbk', 'ignore')           ) ^# V# R8 j9 ~5 w3 h
  100.                 }# j7 V' D0 n# x2 s
  101.             res = requests.post(locoy_url, data=locoy_data)
    # p1 t, ]( c- w: o; r
  102.             print res.text$ [' D( m% `% b: ]! F# f. R( ^
  103.             print res.content$ d2 Q( m; ~7 l; K# O5 g
  104. #            print Dsd% U, Q  k% V' o: w
  105.             return res
    + ]' `& x. A( p) q
  106.    
    & [. B, |! g9 h( W
  107.     def __init__(self):
    0 H& y+ v  z$ ?) ~3 _% m
  108.         self.base_url1 = 'https://www.****.cc/'+ a! {% b3 M' i
  109.         self.base_url2 = '/'3 S, v! c+ j! g9 \, a
  110.         self.CaterId = []' m( h& R# C7 L5 S. G  g8 u5 w
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    4 [* k5 g3 v9 X2 w- e$ |2 X
  112.         self.page_num = 17 L( k( F; P/ d7 c
  113.         self.total_num = 200   
    ! |2 F9 T) |2 y: q
  114. ( `# r* s. \; f% J+ h& V- Y
  115.     @every(minutes=8 * 60)3 G& L3 v, z; v* U
  116.     def on_start(self):
    * P9 U% V( X" l* j
  117.         global Cater_Name
    % m' ~" |& h! D; q( e/ T# d8 _
  118.         Cater_Name = []) w# ?) I! G; z* s
  119.         while self.page_num <= self.total_num: ) n6 a/ c, `- y' B% D' c
  120.             for self.CaterId in self.CaterIds:
    ; q3 N2 R; V5 b  P! O) C" x7 V- J
  121.                 if self.CaterId  == 'xuanhuan':: d3 f9 ]! X' v' \' Z) F
  122.                      Cater_Name = '玄幻'* [. W7 L9 ?" e) w+ M% t% z# ^
  123.                 if self.CaterId  == 'wuxia':- o8 t9 z8 q, @
  124.                     Cater_Name = '武侠'
    ; i: K- B' o# X6 P" E3 U
  125.                 if self.CaterId  == 'lishi':
    - z! h0 d7 z$ \: S' A
  126.                     Cater_Name = '历史'            
    0 d5 {8 v- k- c# K
  127.                 if self.CaterId  == 'yanqing':
    9 |. n4 `. c$ C7 Y
  128.                     Cater_Name = '都市'
    - h( R1 Q# m7 r
  129.                 if self.CaterId  == 'nvsheng':
      o) R* _7 W7 d8 g9 ~! R) {$ n
  130.                     Cater_Name = '都市' , r. ?8 N. z# L( l/ W" D
  131.                 if self.CaterId  == 'kehuan':* k$ y$ x2 x# g9 y6 N, f
  132.                     Cater_Name = '科幻' , |/ M5 ~3 s( Y& `
  133.                 if self.CaterId  == 'kongbu':; Y3 X! ~5 H* V1 N  s1 \$ ?
  134.                     Cater_Name = '游戏' * @0 r2 T6 z* u+ K7 m' e
  135.                 print self.CaterId& y& B2 @$ m0 H
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    * o) y5 r. P- s5 z
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)+ Z9 @6 X2 D1 a* t
  138.             self.page_num += 1
    - A# h' [7 V/ _: h" A9 L. ?
  139.             
    $ o7 |9 o4 N3 T* D
  140.     def list_Caterg(self, response):
    + B9 ~# b$ ^5 F
  141.         Cater_Name = response.save* l, |8 L; C3 {# q
  142.         for each in response.doc('.pic-list a[href^="http"]').items():* x/ P" ]! {7 z
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    0 t$ V) z2 _& _! [8 ?
  144.             - H' [  ^5 g3 v# q6 t2 I: x% [
  145.     def list_Caterg_detail(self, response):( J7 ~$ x* U4 Q2 F: o* X
  146.         Cater_Name = response.save
    6 A! @3 m4 R, Y, O  p
  147. #        print Cater_Name# {& V6 _( a; D8 S% c+ z7 \
  148.         Bookname = response.doc('h1').text()/ U( m" ?) N. N: h$ {
  149.         print Bookname5 W% V7 c. X1 S6 z, ^: x
  150.         Book_author = response.doc('.authorname > a').text()
    . e7 p4 `8 B9 z1 m" }/ t: H0 T0 Q0 j
  151. #        print Book_author
    / T7 F. D; O- L9 C
  152.         Book_Introduction = response.doc('.book-intro > div').text()/ w1 f1 a9 ~* S, f
  153. #        print Book_Introduction5 W% z% W- ?: \7 n# u! f
  154.         Book_Synopsis = response.doc('b').eq(1).text()6 O( _* d3 H+ N9 {& X  U
  155. #        print Book_Synopsis% e. D1 Q  G% y+ i1 r- `# [
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]3 P3 a5 O2 e) u9 L
  157. #        print Book_Palabras
    & ^2 m, x6 W% a) e  Y8 v% a
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID0 q+ U1 w( L1 K# M* R4 ^
  159. #        print BookIDs1 {" n) w' ^4 ~. c5 A- J/ P
  160.         Book_Dates = str(datetime.datetime.now())         : W8 d( g  I! t+ }( A  c
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():5 y+ i7 {0 E! Y% ^
  162.             img = imgs.attr.src
    ; K  V7 m; J8 h& I; L9 L
  163.             print img4 O, q* ~( C3 }3 W. R& E
  164.                 #小说封面下载8 ~9 Q& B- j3 B" ~
  165.             extension = self.getExtension(img)% i& j5 W& n' Z1 J3 P- Z6 S
  166.             name = self.getname(img)$ I3 E7 }% ^2 p% G# [5 N
  167.             file_name = name + "." + extension9 @5 K" n; q3 {; f8 n  Y- t- X
  168.             imgDir = P_dir + name
    ' K" |8 l8 m3 Q& S6 j
  169.             Locaimg = imgDir + "/" + file_name# {! |  |  n+ ]2 b) ~$ a7 K! p/ K
  170.             print Locaimg+ ]$ U; `% F0 L7 K
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地% A; a( r! p3 O  [) B
  172.                 print('attachment url is ' + img)               #
    9 x6 V& d5 A. q3 w% N
  173.             Datos = {
    % u2 U+ e6 b2 i/ T* X/ S7 ]
  174.                     "Cater_Name":Cater_Name,
    " z# V1 C6 l; {( A5 c
  175.                     "Book_author":Book_author,' b4 b- n" \: N) i% ~# ^/ _
  176.                     "Book_Introduction":Book_Introduction,
    # Y' \9 c5 {" a, s3 g& J
  177.                     "Book_Synopsis":Book_Synopsis,
    : g4 v$ x( ]# F0 J1 K3 H+ p' i; l+ d
  178.                     "Book_Palabras":Book_Palabras,, U+ X& M. [: ]: `
  179.                     "img":img,/ G" Q7 y, N' Q$ L( m  q6 p
  180.                 }8 r! M% u6 d6 r- f
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布- c5 Z. B" N0 G
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    / `/ ^  ?6 G+ o  X6 w, }+ r% t
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    8 m% p7 ], p. r; W( j5 w: ~+ Q
  184.             
    ; B# a- i5 `3 X/ c
  185.     @config(age=8 * 60 * 60)   
    + T  ~: u  W* i7 i0 T! j
  186.     def index_page(self, response): 9 D* \( C- T4 h
  187.         Datos = {
    $ i; h  d/ F7 T- `3 {6 p) q) v
  188.                   "Cater_Name":response.save['Cater_Name'],$ u9 y5 w- K( ~# {" o6 i
  189.                    "Book_author":response.save['Book_author'],: g5 n8 T/ y( X! q4 |  h! i
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    . x$ A* j$ m4 m( B8 A  d# y0 d) ?
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    5 U* ]6 ?) z! T* L7 F; }
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    # ^( _6 b8 L8 g' B# e
  193.                    "img":response.save['img'],
    . a3 j* f" d- ^. h' q. N
  194.                      }
    - F+ r/ |) Z& z. w: p7 h
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():" r2 x5 V+ V: H- G4 x
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  . x; Y* E" V' Y, _1 V
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ; I. H6 h3 E. W9 }8 S
  198.     @config(priority=2)2 O- o8 C8 d" u5 a' @, C5 V; o% h  a5 d
  199.     @catch_status_code_error- i+ H0 E; E1 J& V4 E/ C( b
  200.     def detail_page(self, response):        
    ' t% ]" J& @' n$ ~* F
  201.         NewRe1 = u'哈书'
    3 q/ z" J6 R' \7 i
  202.         NewRe2 = u'huhjsd.CC'/ N2 n. M  o- f: n  A5 Y
  203.         NewRe3 = r'^\\n\\n'/ f5 w2 q$ J5 _1 s1 Z2 t; g8 q- Y7 |
  204.         NewRe5 = u'小说网'
    & H0 g7 F& c1 d  M7 {' ^
  205.         NewRe6 = u'fgdfgf'1 {2 ]0 W5 `$ Q+ f( ]) Z
  206.         NewRe7 = u'fgfgf'- _0 ]1 E0 c2 l& n' p
  207.         NewRe8 = u'ffhgf'" e; i& k( Y- W' j
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    8 F* s' N6 s- j( x
  209.         ReC1 = u'静思'
    4 W! i% G& P* ?8 s2 U* A
  210.         ReC2 = u'aghgf.com'
    5 Y& c+ T4 z* r- \3 A) Q1 [
  211.         ReC3 = u'aghgfh.com'+ G0 S9 W' u) g9 [+ d4 X
  212.         ReC4 = u''/ g# {  b3 ~) j: ?( H# r" S
  213.         ReC5 = u'文学网'3 S! z7 q' V3 [+ ?, S' l2 I
  214.         ReC6 = r'<BR>'! T1 A% P4 @8 a' G& \5 c( E9 k
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    $ ?) v; G+ d' [/ \6 L
  216.         print Bookname7 I/ d; R5 M2 K8 y
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类5 D( [$ k% i9 i) N# b
  218.         Book_author = response.save['Book_author']   #小说作者1 s" J1 X: _4 B7 R0 t6 h5 J' G6 [
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介" }+ K5 x8 w3 Z$ g# p; N$ J
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新: c: }9 |8 D1 E/ ~; ~+ {7 x
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数* {( Y3 N  u3 I# ?6 b+ \4 E4 W
  222.         Bookurl = response.url   #小说网址
    8 H( O" X: L/ d. i9 b
  223.         Booktitle = response.doc('.article-title').text()   #章节名称; o, o& K2 R6 c* o
  224.         BookID = response.doc('.readset-r span').text()   #小说ID. z5 R7 J' f. R  @# j% |8 x
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    , g/ b" W/ P4 S: \- [, d2 h# l% J
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)2 P  q, F, y! B. u7 Q: ]
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间- F: o2 f# G, d8 k+ y/ r' s
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)1 e2 j) `) K. y8 a1 F
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
      F8 E% v% m! C) f" \4 z; t
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)* a7 @- e7 L; l, m
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    ' x' N( Z: ?  k% Q8 q8 p
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)) f3 k( ^+ k& S* O' W8 U
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)% ^* F' N1 ^6 I5 k) f
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    ! z, G. Y" m6 x( f9 D; |) B
  235.         BookConte = BookConte4.replace("\n\n","<br>")# R- y, W1 H- e+ a6 E: s
  236.         print BookConte
    , m; r; C$ z1 q8 `7 j/ Q; ^- @. U
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    # z% g. Q& i2 C" A( C  ^
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)% j# A8 p& ~+ w
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)* j5 W9 u; Y# O+ ^" d
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)) U6 w% r# D4 J4 k& `
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    1 a* B. a% _, _. c& k$ ^+ o  i: i
  242.         Book_img = response.save['img'],  #小说图片
    $ S7 @2 N: U/ ^  F
  243.              , o: w. R3 g. }: ^. O' I1 u
  244.         #insert into MySQL 小说入库% S9 Z8 q2 V( b+ m) N
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    4 C  ^& o$ a7 X. x3 f# u9 F
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布; [5 }. r- [( W: D
  247.         #post提交发布( h( T' ?9 O' I
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    0 B+ a% V( z; P3 b- [
  249.         Datos = {
    ) q' x% V& o. I$ x1 l5 S3 y. w
  250.                   "Cater_Name":response.save['Cater_Name'],7 {2 I! [1 o  S9 R& `( g
  251.                    "Book_author":response.save['Book_author'],
    * G6 e8 e  @+ T' _2 D
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    . b8 C% h) \: y$ C9 u3 Q" t. v- j" Z
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    8 O, l% }% ?* O' z  i
  254.                    "Book_Palabras":response.save['Book_Palabras'],8 D# ^. E0 o9 {, \0 E
  255.                    "img":response.save['img'],
    ! {# Z# A/ X9 }& C1 Q7 j
  256.                      }
    # p2 F' P/ a. l9 L/ _
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    8 ^# h, P  m! b% W/ |, Z
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    - J3 [  k; z8 Y2 G; o
  259.         return {% X1 d' X% [9 m
  260.             "Cater_Name":Cater_Name,
      |$ z5 g& X! F( E7 u; w) ^
  261.             "Bookname":Bookname,
    $ T- J- ~# M9 N# C. L
  262.             "Book_author":Book_author,
    2 p; l5 R' T& w* x* Y% ^
  263.             "Book_Introduction":Book_Introduction,
    ' [/ ?. ~- f$ b
  264.             "Book_Synopsis":Book_Synopsis,
    7 w. O6 r0 B6 Z5 `+ v
  265.             "Book_Palabras":Book_Palabras,( A( k  a( t' R
  266.             "Book_img":Book_img,
    8 n3 a3 m% o0 o1 ^5 s- [$ h8 ?
  267.             "Bookurl": response.url,
    / w; l6 \4 H0 y- k. _. n( i" H
  268.             "Booktitle": Booktitle,3 H. G+ H+ C0 _0 A* u+ \
  269.             "BookID": BookID,
    . K" d- p9 b& p0 O7 d
  270.             "BookConte": BookConte,
    ' E4 u& U! ]: Q  b
  271.             "Titleid": Titleid," C3 l1 e& u' B) }9 y7 n
  272.             "abover":abover,- |) u* w7 W7 }+ U& w
  273. #            "Book_Date" = str(datetime.datetime.now()),
    4 ]# t0 ~( a* B+ z4 @# m  m7 h- n
  274.         }% e  Y: E! @( T9 P
  275.     def download(self, P_dir, imgDir, file_name, Book_img):$ M$ W: I, B: @
  276.         if not os.path.exists(imgDir): ; l) Z' l& m; J2 {! |! V. M
  277.             os.makedirs(imgDir)7 ~1 f( E9 _* a% B: b6 F' p! u$ p
  278.         file = imgDir + "/" + file_name  M7 m( d1 H4 _
  279. #        print file
    , h3 G4 A% Q. T' z4 z' E  h
  280.         f = open(file, 'wb+')2 x" P9 \: U. X) B/ x5 ~$ ~( v5 j
  281.         imag = requests.get(Book_img) & `8 z( i' J' E" O( N; B
  282.         f.write(imag.content)+ B5 W' z- O, Z" y6 }7 o2 X; X8 H
  283.         f.close()2 F8 Y' H2 z9 G4 g" V
  284.         #保存图片前8 }* d% c) h% {9 Q1 ^
  285.     def save_imgs(self,response):3 k6 l% a! v- q5 a+ l
  286.         content = response.content
    * f5 W3 {* `( m
  287.         file_name = response.save["file_name"]- g& [; r# q" R( P9 s' c: b3 G1 ^2 I% @
  288.         imgDir = response.save["imgDir"]
    ( X" \5 a+ u( A2 k9 }2 j% f
  289.         file_path = imgDir + file_name
    , A5 q& z( i9 y+ W
  290.         self.save_img(content,imgDir,file_path)" h" Y( u' g$ Q+ T- E
  291.     #保存图片! i' T) O) i+ V) b$ P, ?1 t
  292.     def save_img(self,content,imgDir,path):9 t7 w4 }5 P1 f& p  t2 g7 I; ?
  293.         if not os.path.exists(imgDir):                         , g3 _0 V; g: f, w
  294.             os.makedirs(imgDir)
    2 f; E# T9 _4 T' q2 Q* z
  295.         f = open(path,"wb" )! w3 Z/ h, X9 w& n/ u  |
  296.         f.write(content)" n  `  ^& w% ~; n
  297.         f.close()$ Z, j& O% _* {% ^$ w; ?
  298.     #获取url后缀名
    ; N7 M2 N, X- |6 Z$ L" x3 N: B* l
  299.     def getExtension(self,url):                           
    6 V$ n' I+ O0 R! g% ]3 j8 x: }
  300.         extension = url.split(".")[-1]
    3 S# `0 R/ e" ~  l3 r  s
  301.         return extension
    / O* h" Z3 U' U0 d' @
  302.    
    " K! `$ b2 Q9 S2 S1 h
  303.     #获取图片名3 d7 U- S, @, z
  304.     def getname(self,url):4 F" u; n4 i. F
  305.         name=url.split("/")[-1].split(".")[0]
    * }7 K: y3 Y9 L2 e9 Q* C
  306.         return name
复制代码

) ]  j2 R3 h: r: ^$ Z
4 G1 w7 O9 s. j
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-2-19 06:59

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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