找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
- H( h& R( o8 p: E5 B
  1. #!/usr/bin/env python, Q6 n' E- b  Q7 |2 g9 `
  2. # -*- encoding: utf-8 -*-
    $ ]& ^- j4 p, K9 d
  3. # Created on 2019-05-05 21:43:11
    + M8 W  _9 U/ [$ L
  4. # Project: XiaoShuo. l& E; ?" B& H. s

  5. . Z1 |1 b$ k6 {, }9 }
  6. from pyspider.libs.base_handler import *
    : Z4 D  j  N, T4 ?7 _$ z/ B7 `
  7. import pymysql
    # `- i  e% X2 S7 h- q3 O% w4 H
  8. import random
    % W$ ~2 r, h' I0 O7 G. U
  9. import datetime3 I# r" R0 n0 ?, m
  10. import urllib2,HTMLParser,re% T. z' H- I: _, P
  11. import os
    * y' H% e+ t5 O# L# C! N8 u
  12. import sys5 R& ~( g0 ^* m4 L! Q
  13. import re
    1 H! _8 J( T2 ]" E5 y# r# }
  14. import codecs1 v! |6 T* |1 w9 j$ e% d6 B$ W
  15. import requests$ a# b! y) H- ?( J. Q- j2 g
  16. import json/ k0 p, b2 }. S/ k( w/ ?; J# _9 j( ~
  17. * v" @/ X& B- n" v5 U* B
  18. class Handler(BaseHandler):/ w# B, ]4 p( d$ ]
  19.     global Datos
    - R, r) Q2 P  p4 E
  20.     global P_dir    % z0 r: k4 O& X' ^8 T9 i* n
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径/ E0 S6 i  ]; v1 b
  22.     global Datos
    % O2 {+ Q5 C- }) W6 l- P/ v
  23.     Datos = {}
    ) f' f5 E/ m/ w. t
  24.     headers= {& J3 |( B+ T. n: X1 u; l- l! D
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    8 ]- o7 p0 F0 Z8 w
  26.     'Accept-Encoding':'gzip, deflate, sdch',
    + }/ c' _/ ]: A1 a1 \
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    : x0 j  h: A, Q5 y  B  b; |, o
  28.     'Cache-Control':'max-age=0',
    : R" D$ [. D, }5 B* u
  29.     'Connection':'keep-alive',9 k" J& `; R0 r
  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'
    4 H4 u& K% x( M6 n. `3 W9 W# ]' q; |
  31.     }
    , l! i( {% ?% [3 Y5 v2 g0 p
  32.     crawl_config = {& q5 c% b) f* |7 M3 u# T
  33.         'headers' : headers,
    : Y( z4 g1 M5 z  z8 @. k, s6 e
  34.         'timeout' : 300
    % u& a* {* ?5 u( |# B
  35.     }
    & J& f. |5 v0 |  _' ?- n2 j* ^
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):4 c7 x# l& w, {& s/ X3 P4 M, d4 H& K
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")8 B) L+ R4 x3 r7 H, M
  38.         try:% `9 h6 m% p: Q5 P; @" n
  39.             cursor = db.cursor()
    : a0 m/ u, J  [9 ~# m
  40.             #注意此处字符串的占位符要加双引号"%s"
    8 c( F) c$ J" b8 B' r
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    % P! l( i8 \7 C& D1 A
  42. #            print(sql)
    & p" v$ A7 _+ D7 O" t4 B9 p4 O. u
  43.             cursor.execute(sql)
    # Q% m; F. R+ T/ Y
  44.             ( N9 V/ ~4 Z; \
  45.             #qid = cursor.lastrowid
    " s8 i3 o. E" @5 q$ i' g
  46.             #print(qid)
    9 @% ^, h2 `! }% z
  47.             8 r; c) }6 x7 |# P
  48.             db.commit()) j% M7 ]% F+ t* H' |- h6 ]$ a' `
  49.         except Exception as err:
    8 ~0 p! e$ {, N! ]! F7 k
  50.             print("Error %s for execute sql: %s" % (err, sql))
    . C7 x  P" Z, Y5 U6 I2 d$ N
  51.             db.rollback()4 }" V+ [. u" ^! k3 F5 s
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    / j7 C+ ]4 [) D  ]  i+ ]1 y7 _
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")0 b  K: B6 q- n( N$ ]
  54.         try:
    0 x. M& M- r9 B, q& w
  55.             cursor = db.cursor()
    7 w: b, _6 l+ K
  56.             #注意此处字符串的占位符要加双引号"%s"$ I# r' \* w' ^9 [
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    : d7 L0 y, e4 B
  58. #            print(sql)1 J8 Z8 N' W3 w' D  l' r4 A
  59.             cursor.execute(sql)1 ]. i( w6 E2 r) n. z
  60.             - ?  a$ }3 L$ Q1 e5 z
  61.             #qid = cursor.lastrowid/ x0 R5 j( i0 q3 A+ a
  62.             #print(qid)5 X7 D3 e$ ^% Z; Y
  63.             
    ; K' J$ w( C4 D, Q0 @" P0 ^  z4 H  x
  64.             db.commit()5 b5 ?$ r" v2 H: Z5 y5 |: {
  65.         except Exception as err:
    4 |- Q/ G& n% g) z7 o/ ?
  66.             print("Error %s for execute sql: %s" % (err, sql))- V7 i0 B; }1 p8 |- G; j* z
  67.             db.rollback()
    ! o: J, r; G8 E5 K% F# [
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
    7 d2 \' s& c& r6 D1 j8 t9 `5 z9 R, X
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    0 e4 W, i. q# y) ~! L% x! i
  70.         try:0 j* O& V; ~4 ?8 J' U
  71.             cursor = db.cursor()+ f' h* E' R/ r
  72.             #注意此处字符串的占位符要加双引号"%s"! q3 W6 [9 R# \, H( G5 K# D5 {
  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);3 K2 ~3 i& ~! O0 D" r! B
  74.             print(sql)
    ; P- k; b6 t  h5 c9 \2 ]9 s
  75.             cursor.execute(sql)
    1 \" z2 v) b. c) ]' E9 V8 U7 _
  76.             print(cursor.lastrowid)
    % n9 s9 i: S: H9 k
  77.             db.commit()
    ; q2 Q4 m; y7 E4 }+ ~. X9 ?1 `
  78.         except Exception as err:; t5 w; V$ Y/ m
  79. #        except:8 T  {1 D7 }# Y9 S4 m+ s, t
  80. #            print('Failed')
    % P2 W8 E) c1 ^! X3 z! i
  81.             print("Error %s for execute sql: %s" % (err, sql))
    . q6 I# n; L1 p- p& z
  82.             db.rollback()
    4 z* E7 Q, [) G* J7 |
  83.         
    ' H0 Q7 v7 V9 V- [3 l4 ?
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover): & U" v  a2 F8 K
  85.             reload(sys)1 |5 U; G4 \3 _8 O5 @+ ]- q) n
  86.             sys.setdefaultencoding("gbk")- b! Z, L/ e8 R7 x5 j
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址: b" J: W9 y3 V9 i
  88.             locoy_data = {. U# o( k0 n3 f2 s6 X) `
  89.             'my_u':'用户名',   #后台用户名
    1 M, N, g5 o' x0 Y% P2 @
  90.             'my_p':'密码',   #后台密码1 h$ G/ U7 R6 _" Q1 \& N
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    ) s6 ~$ u' E# x/ |8 U7 [
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),( r3 x: S2 E% k2 v7 t9 h3 S
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    ) G4 z0 ~' t, K# g. ?. ^& J9 K
  94.             'article':BookConte.encode('gbk', 'ignore'),* @. |3 p' j6 x2 ^7 ^
  95.             'author':Book_author.encode('gbk', 'ignore'),
    # N/ |( X+ |" d) Y5 V" ]4 D
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),4 [8 h9 t. H" e. x) j4 A
  97.             'thumb':Book_img,' |. g% ^3 n+ [$ M6 P
  98.             'content':Book_Introduction.encode('gbk', 'ignore')," N) Z1 X9 p+ O4 g
  99.             'abover':abover.encode('gbk', 'ignore')           
    ( b  K3 G- o  J  s
  100.                 }% K: y* T) b: k5 O6 c9 Q4 O  p
  101.             res = requests.post(locoy_url, data=locoy_data): C+ l. e% s& F- H
  102.             print res.text9 }' h0 w: @  a7 j, w0 D. V
  103.             print res.content3 w5 b" s% v! Q' x! l$ Y2 f
  104. #            print Dsd
    ) _& K( L! r; k+ q9 M$ A
  105.             return res9 n8 F% K* s! q4 M& ]8 D
  106.    
    , n% g/ Z& p& L1 z& Q- g6 s& y9 ]
  107.     def __init__(self):8 |6 [: \" v" F' m: x
  108.         self.base_url1 = 'https://www.****.cc/'% ]" t1 |# Z% d" T3 q0 ^3 v
  109.         self.base_url2 = '/'
    7 F9 p2 c, m/ V# ^
  110.         self.CaterId = []9 A  M8 ^+ ~$ Z) _7 H
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']' j' U8 j# q! U3 j5 A  p
  112.         self.page_num = 1$ e7 k5 B2 y  n  |9 c  P& t; }* P6 A2 }
  113.         self.total_num = 200   
    - `- R$ B, V" s0 ~$ x- _3 g# J6 `
  114. ( ~; I2 {3 S1 ~$ w8 P9 N" K: |
  115.     @every(minutes=8 * 60)
    5 b& g* X$ \: _- l# r- D
  116.     def on_start(self):5 [# U" \1 o+ w: F! {5 J* z1 _3 C" U4 B
  117.         global Cater_Name0 a1 q, C0 ~$ w* p+ c5 l9 T
  118.         Cater_Name = []
    % h1 O. T4 c" B* M
  119.         while self.page_num <= self.total_num: + T0 h7 D. E: `6 N- R( I$ }9 l
  120.             for self.CaterId in self.CaterIds:
    / \8 }( B6 l" Y, `; }
  121.                 if self.CaterId  == 'xuanhuan':
    " s$ O! W# ^0 x0 ]" E! D
  122.                      Cater_Name = '玄幻'6 `5 X: l3 J0 M" \; z' Y9 R
  123.                 if self.CaterId  == 'wuxia':
    2 V: _& P: O) L5 Z1 P
  124.                     Cater_Name = '武侠'
    , E. K5 F8 E- j$ L& q
  125.                 if self.CaterId  == 'lishi':
    , [5 V4 `* g- H& S
  126.                     Cater_Name = '历史'            
    ' l8 V0 O* A8 W% d& z$ w$ a
  127.                 if self.CaterId  == 'yanqing':
    ; e2 A3 P- i1 p% W
  128.                     Cater_Name = '都市'
    ! I* E8 [2 q. i7 Y  C; M: f: G
  129.                 if self.CaterId  == 'nvsheng':/ Y$ {: s. [8 {3 q3 F
  130.                     Cater_Name = '都市'
    3 [' P3 k) T7 b
  131.                 if self.CaterId  == 'kehuan':& i2 R6 ?1 I) b) f9 e6 c
  132.                     Cater_Name = '科幻'
    ) E; z, c/ ^0 H9 \2 h
  133.                 if self.CaterId  == 'kongbu':
    : k% T% W3 X- n/ P+ i
  134.                     Cater_Name = '游戏'
    $ n2 w; h2 R% c0 w1 w' j
  135.                 print self.CaterId' E4 t6 G, m3 C7 o5 `
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          & K! y2 Z% ]& B3 x4 i
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)& N, [8 K' u! M6 E; R" Z
  138.             self.page_num += 1 5 x+ ?$ T6 a4 l' P
  139.             ; O# l6 t' u# H. _3 `( r
  140.     def list_Caterg(self, response):
    , [% o  G* |8 J" w  K* ^5 d
  141.         Cater_Name = response.save
    : h0 l1 n- i; i  b  S( @* C" \
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    $ T$ R! P; }8 g, g
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    & `7 I5 U2 r+ `, I* @( D
  144.             
    * Z3 S9 l, }) Z8 X" b
  145.     def list_Caterg_detail(self, response):' t8 R* k* y$ M
  146.         Cater_Name = response.save
    6 ^  M3 R2 p1 S  y: c4 Q; E
  147. #        print Cater_Name
    $ _# e' _* q  E2 u  X
  148.         Bookname = response.doc('h1').text()- i0 _8 Q6 D/ h; Q
  149.         print Bookname
    * ]. m: Z( K% {
  150.         Book_author = response.doc('.authorname > a').text()# J) U- M) e+ l, |, x& ]: g: L
  151. #        print Book_author4 R$ A; A$ _+ c! ~$ h5 c
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    ! i9 C/ M4 K+ y/ R; |; x
  153. #        print Book_Introduction
    : D5 r' g7 g: s4 G) e+ l
  154.         Book_Synopsis = response.doc('b').eq(1).text()9 W( ~+ l% B1 W, w8 e
  155. #        print Book_Synopsis0 ~( f  `$ U. G) k; y& @
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]: I; f$ F0 \2 l$ W
  157. #        print Book_Palabras- n$ q) V$ I: I( T- ?
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID8 L" Q+ [  W4 ]( _, w
  159. #        print BookIDs- Q7 d* ]3 T2 d! ?1 R$ T( Y4 G
  160.         Book_Dates = str(datetime.datetime.now())         
    ! Y3 J' }) L1 I7 e! L* d
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():$ ^! j- s6 c- j/ R6 K. A  m1 q
  162.             img = imgs.attr.src$ |1 }- C7 x% f. i' u: a
  163.             print img
    ; }% V/ A9 F+ l( |: a9 E
  164.                 #小说封面下载
    ' F2 f) T0 L2 E& X. \) N
  165.             extension = self.getExtension(img)
      H- ?4 |- q/ J8 ~$ T
  166.             name = self.getname(img)7 H& l9 l* I8 S0 q2 g2 M
  167.             file_name = name + "." + extension
    + v) c4 O) n) D: s7 c- p# @
  168.             imgDir = P_dir + name! A; G. L- J( E! v
  169.             Locaimg = imgDir + "/" + file_name! k0 c+ I! z3 k8 S
  170.             print Locaimg4 c8 O5 u9 z5 K) N2 S. F  |5 I
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地! ?9 l) j( k' h% H3 r
  172.                 print('attachment url is ' + img)               #
    " }  v4 Q/ E8 y* e7 a/ ]: c
  173.             Datos = {
    2 Z! c$ Y! J& s+ |8 B1 L+ G& K
  174.                     "Cater_Name":Cater_Name,5 @8 q! }5 [! C/ m! B8 s
  175.                     "Book_author":Book_author,
    / J# a3 N9 m5 F: T, r
  176.                     "Book_Introduction":Book_Introduction,& A4 v9 a, X: G( f
  177.                     "Book_Synopsis":Book_Synopsis,3 i6 @) g2 C& q! [
  178.                     "Book_Palabras":Book_Palabras,, a) s( \% \$ y1 F! N" @% V$ h
  179.                     "img":img,
    7 ]$ V- ^: m$ h$ }
  180.                 }
    0 i2 D8 l1 y* D( \# |6 Y% j% g
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布+ I8 w5 {1 s( |6 B7 ?, n! R0 C
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():/ e# }3 r$ X) k  R% n% l2 m/ Y9 Z: d
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)! _9 R1 o' Q8 Q: l
  184.             
    7 W. z- a% s4 J( v  s" e( Q
  185.     @config(age=8 * 60 * 60)   
    + o* B# C+ y9 `$ Y1 f+ W
  186.     def index_page(self, response): 8 G* D# j% _  f7 K
  187.         Datos = {
    & Y& |) {( s$ w% ]  v8 [$ o! T
  188.                   "Cater_Name":response.save['Cater_Name'],
    ' {  I; G# W1 l# L* t+ U
  189.                    "Book_author":response.save['Book_author'],
    1 ^; i1 x- e* l( v. t* `% p
  190.                    "Book_Introduction":response.save['Book_Introduction'],& j! D! \) G9 N( x
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    8 ?5 |$ p! y3 [7 P: j& s+ o. e
  192.                    "Book_Palabras":response.save['Book_Palabras'],
      ^9 h' j# q& m; T3 B5 N+ I: D4 V
  193.                    "img":response.save['img'],
    - e; r1 n3 y5 S: \3 a3 H" g# O
  194.                      }
    * T. Q9 g) R4 z$ z3 p
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():7 a: z4 o/ W+ y7 X( T- C7 g( U
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    4 _3 b5 F' F" w( K# v2 k
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ) y7 T3 l9 x0 p2 x9 v$ [0 t- s1 L
  198.     @config(priority=2)
    : G* D( y3 [- G0 }
  199.     @catch_status_code_error
    9 k8 J5 S3 E) }, y0 o
  200.     def detail_page(self, response):        
    . H& a) u% b& v: ]! V
  201.         NewRe1 = u'哈书'
    " S4 [- Y- Q8 Y1 o
  202.         NewRe2 = u'huhjsd.CC'* _4 U+ P1 P2 a  s
  203.         NewRe3 = r'^\\n\\n'
    , l8 \6 F% E1 g3 g4 S
  204.         NewRe5 = u'小说网'
    ) F6 T# V; n8 r( ^
  205.         NewRe6 = u'fgdfgf'% I. ?; d. ?& a4 o% |
  206.         NewRe7 = u'fgfgf'
    1 Z5 K+ h* A' @1 Z0 M& f" y) ~
  207.         NewRe8 = u'ffhgf'1 U* e4 {: W/ Z9 E& K/ W
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'+ [; Y' M2 @( f  O1 D5 ~  u' Z
  209.         ReC1 = u'静思'
    : H0 h( T* N6 v% Z' L
  210.         ReC2 = u'aghgf.com'
    9 A) ~( _* A; u6 o% J7 j, k
  211.         ReC3 = u'aghgfh.com', ^# y+ `' j  \" {3 ?. e: ^; `% B
  212.         ReC4 = u''
      K3 L- f2 K$ S0 m# A5 W7 \- M
  213.         ReC5 = u'文学网'
    : [* D! p( B+ U$ T( ~' z
  214.         ReC6 = r'<BR>'+ ^  L% L. f8 m, I* J5 b" D4 E! A
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称& U: O4 I* I# S0 `5 k4 J
  216.         print Bookname: U; ]( \( l) }" V8 g4 j. q4 u. i
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    % W2 i, Z& z8 E5 O/ z
  218.         Book_author = response.save['Book_author']   #小说作者! m, ]+ r8 |, M* B5 Q0 l4 `
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介) f& D/ F0 ]+ x- }$ I. m6 Y
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新5 Q% k- X9 ~8 y$ h
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数! M1 h4 N* z' `3 v2 G
  222.         Bookurl = response.url   #小说网址
    , P6 ]0 u9 @5 ^8 h+ ?
  223.         Booktitle = response.doc('.article-title').text()   #章节名称0 P4 U4 Z7 M& ~
  224.         BookID = response.doc('.readset-r span').text()   #小说ID8 o- E6 T' y& d" @
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    # R& m' Z3 L5 P- n, I8 e. {
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成). h% u' e, G( |: c$ ~0 T: @- L
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间: _, C  O. u$ o
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1). \0 @& i9 h3 D6 ^, W
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)" Z+ }5 C: U( I' ?5 `9 L
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)+ h) M' e9 O; |$ d  z3 J/ |  Z
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    7 T1 `1 m; u4 Q
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)  v- M- i2 f- V- g
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)2 n0 o7 r1 s1 ~& B, P9 j5 D& L# P
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)' [1 ^8 `' C% E3 r5 Y6 E, I
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    7 a" o4 t* G" v0 x8 C0 R8 F4 y" Y
  236.         print BookConte% {  a, o1 F+ I& x' g; z# t
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1); ~8 H' Y6 g$ N9 U' |
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)7 |0 `( r# m+ t
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)" U5 _$ l- i( F
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)( i) f" ^; y' U; X$ [; g! \
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    ; |: W7 B# b; C/ q  A2 h, j
  242.         Book_img = response.save['img'],  #小说图片
    ! N$ N1 B# Y% `
  243.              . Z5 h  q. g2 Z! d2 l& i4 _
  244.         #insert into MySQL 小说入库5 h% I3 l9 e1 P! ]( n8 j
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布5 j1 m0 H/ P4 n9 s( L
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    9 y, L" _3 ]( \% i  B4 l
  247.         #post提交发布  r! N( Q, a7 Z# q& J
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    - O9 n" P  n5 t: V
  249.         Datos = {
    % V* k8 r7 Q3 E5 \5 o$ E3 L; H) q* C
  250.                   "Cater_Name":response.save['Cater_Name'],4 t9 }  B3 i! h' X. J
  251.                    "Book_author":response.save['Book_author'],
    6 A" M: U1 @2 b2 E4 n0 Y
  252.                    "Book_Introduction":response.save['Book_Introduction'],+ C- R# N7 Y2 I# {  F0 ]
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ( V2 j. M# r2 f) f, m
  254.                    "Book_Palabras":response.save['Book_Palabras'],: I9 s2 {( h: z% |; J( C
  255.                    "img":response.save['img'],
    ! z. B. J& I" v: h* v2 `* q
  256.                      }0 j' f" ^* m' g2 q5 _8 K/ D; W% T
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    * M. k8 q; M: Z1 N2 v
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    " T" M, ]8 c9 H$ |/ W
  259.         return {
    9 T5 I: R* j/ A
  260.             "Cater_Name":Cater_Name,
    # v8 H& W" u( M5 w, H
  261.             "Bookname":Bookname,
    # Y* \* _2 ]0 a; C6 k
  262.             "Book_author":Book_author,- |7 n2 Y0 j7 F/ q
  263.             "Book_Introduction":Book_Introduction,  P" ^% l0 |# W# w3 G7 ]
  264.             "Book_Synopsis":Book_Synopsis,1 n8 V) X# q  E# q3 `
  265.             "Book_Palabras":Book_Palabras,
    , x' j# {% L9 d
  266.             "Book_img":Book_img,
    $ {9 T; \* K- q' ]5 x  _/ y
  267.             "Bookurl": response.url,& U/ n/ |. ~7 A
  268.             "Booktitle": Booktitle,) J, A! d, P% o0 Q. o
  269.             "BookID": BookID,( |3 k# u/ z! G$ l+ M( J6 f
  270.             "BookConte": BookConte,' D2 }% ~* Y) g
  271.             "Titleid": Titleid,. q5 w9 Y! B8 B7 _4 U2 Z) {
  272.             "abover":abover,
    5 K' \- y3 Q( q' v) Q! W
  273. #            "Book_Date" = str(datetime.datetime.now()),
    ! c# h) P  x2 ]9 `, N1 z  D
  274.         }* h& H  ~$ Z3 e# e7 k/ T1 S1 x/ I
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    * L, l% u8 Q4 ]" Y
  276.         if not os.path.exists(imgDir):
    & z& r0 i; i' O- G8 L% Z
  277.             os.makedirs(imgDir): l9 y" Z* T" [: D& ?
  278.         file = imgDir + "/" + file_name) x! h- y/ s- o' a
  279. #        print file3 l4 _8 U& o- s: U
  280.         f = open(file, 'wb+')5 d: L, R% }- l& v) f
  281.         imag = requests.get(Book_img) 0 u" X) H6 q1 N6 z  E- L+ Z6 b
  282.         f.write(imag.content)4 i6 i" c; S& x7 c6 {! G- _+ P5 K! I
  283.         f.close()
    0 z& i/ D) O& i2 M. R
  284.         #保存图片前
    ( z1 ~8 O0 S' t" i# N
  285.     def save_imgs(self,response):/ v& |3 w& F) P: I# ~0 p' K# n( n1 C
  286.         content = response.content
    6 |8 }- A' C4 U9 R" I% U
  287.         file_name = response.save["file_name"]( D6 g. y# g; K! A
  288.         imgDir = response.save["imgDir"]
    ) k% N5 j7 j( D6 c9 f2 p7 y
  289.         file_path = imgDir + file_name3 q* i& ]- f6 ]- d
  290.         self.save_img(content,imgDir,file_path)$ X+ ?- ^; S3 s0 g$ E
  291.     #保存图片% `. n. q& _1 z+ Z* t" S
  292.     def save_img(self,content,imgDir,path):
    ! K7 X& ?2 p9 }! N# Q. t
  293.         if not os.path.exists(imgDir):                         3 g; u# J9 K8 [, }
  294.             os.makedirs(imgDir)
    $ o& _; C' j( U) D6 i9 J
  295.         f = open(path,"wb" )
    1 L- Q6 @* V) R" ?& ~4 ^% ~
  296.         f.write(content)
    6 q: J3 N' |- Q5 x4 c1 x% e
  297.         f.close()
    $ y6 D% }) _5 C  |6 o% H
  298.     #获取url后缀名$ I. H& A3 q1 E9 F
  299.     def getExtension(self,url):                           
    - e; S0 j7 c0 m6 |. d
  300.         extension = url.split(".")[-1]
    ( O: o/ X& b; S
  301.         return extension % @! [# A1 @, c' b
  302.       {: E* {3 v; C' y5 p' i
  303.     #获取图片名
    3 i: K3 g! Y5 S9 ^, |, C. a6 E% s9 W
  304.     def getname(self,url):7 B- m& |5 g4 a. _; z
  305.         name=url.split("/")[-1].split(".")[0]. ?& p: I. u, Q  m0 S% H; y
  306.         return name
复制代码

; [5 K: O% |9 B* _: p, R+ {. ^9 K
+ j( N) W0 U: I8 a) R0 V
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-3 11:02

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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