找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
0 `) y* h& h7 x" P# T  H, G
  1. #!/usr/bin/env python. u. `# I$ y: ]: ^( q
  2. # -*- encoding: utf-8 -*-
    / A7 x  d; m/ w
  3. # Created on 2019-05-05 21:43:11- P6 i( {- B7 y0 C3 t, C: e0 [
  4. # Project: XiaoShuo- c6 p; _2 S5 f' o

  5. ; {) ^1 o2 y" Q
  6. from pyspider.libs.base_handler import *, P5 z5 s8 Z0 u+ q) d: f
  7. import pymysql
    * q3 H* N% r  p  M+ I/ N
  8. import random
    ; N* j0 b$ F2 l) ]
  9. import datetime1 o/ }% q/ J2 {
  10. import urllib2,HTMLParser,re
    0 ?5 A2 Y3 t7 V; f; a2 t: [2 h) a1 V
  11. import os
    5 ?" c' O& {$ K
  12. import sys
    ! J; M( e1 @; ^1 w1 N
  13. import re
    + @9 }, Z" w& \/ |3 u' |' n% c& L
  14. import codecs1 `: g4 j9 W. m+ y
  15. import requests9 g* ~# }5 {( x0 ?( D7 ^
  16. import json
    ; n6 f$ H! s4 d

  17. ! l0 m' @% h. M2 i  {7 L- \
  18. class Handler(BaseHandler):
    ; C  k" d. s. k- x
  19.     global Datos* N9 \# L8 ]* f) a1 L
  20.     global P_dir    6 a5 T! C  X2 o" T, e
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    ! W# i! {  Q' v' }9 c% D/ S, i
  22.     global Datos9 ~8 m- C+ \6 P9 Z) o' o4 v0 q
  23.     Datos = {}
    ( t5 i+ L; U9 O5 O0 M- I3 F) c
  24.     headers= {4 i" ~7 i" ^" z2 ~9 D
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',, L" S  g  Z5 p
  26.     'Accept-Encoding':'gzip, deflate, sdch',; \. B- S8 e# N
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    ( Y& _6 y% y) H
  28.     'Cache-Control':'max-age=0',
    2 l+ B8 s. R' s. z8 B) h( a7 _- O) y
  29.     'Connection':'keep-alive',+ [7 [( g- l% b0 h8 {% M+ e' F
  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'9 F* R+ F& O6 c6 W9 u; F% z: Z
  31.     }
    0 B; e0 z! r# v6 H; e
  32.     crawl_config = {
      x' v( x1 ?& K2 _4 I
  33.         'headers' : headers,/ p5 b( v% x# a2 D. G; {
  34.         'timeout' : 300( d- N7 c, t! B. y3 _* P
  35.     }
    ( N& N4 \4 |2 B8 \+ \- n
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    : t6 r" W2 d' C6 n$ l
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")$ l& {6 \, f2 e5 P+ p( [6 F
  38.         try:+ T) P  {1 g9 A, t1 b) y
  39.             cursor = db.cursor()/ r2 m) I/ P8 |! t3 V# j: t* m5 m
  40.             #注意此处字符串的占位符要加双引号"%s"$ Q0 v! e' e1 |4 `5 p- O
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    7 l  P; r. H$ e' h5 E1 c
  42. #            print(sql)
    : L7 [5 f8 |8 g5 [
  43.             cursor.execute(sql)6 J* x) z% X- b
  44.             
    ( O0 x: h4 S: q' [2 _# D( `
  45.             #qid = cursor.lastrowid
    " |, t. v& g; \% m4 D
  46.             #print(qid)
    4 N! R6 o. T. T/ j
  47.             6 X7 ?2 J8 s3 ^  _7 ^
  48.             db.commit()
    9 i- ]" e* ?' s8 I4 U, |0 }
  49.         except Exception as err:
    8 H3 J7 G4 U3 V" h, ^. V' p
  50.             print("Error %s for execute sql: %s" % (err, sql))
    ) W* {) Y- C0 g2 d
  51.             db.rollback()3 S( b6 f- q  I5 z' B
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):3 f) ^- [6 E6 y% p/ Z! o$ F7 i
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    , J3 ^- `/ J  O: m  q' ]
  54.         try:
    / Q/ d! r) U0 D8 s9 e  p/ V' g7 [
  55.             cursor = db.cursor()% P6 U# n7 ~8 i* N2 x$ n
  56.             #注意此处字符串的占位符要加双引号"%s"- \. w3 A, S4 w2 ?$ B- [
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    / `( E, Y5 o5 c6 c4 @2 i9 X
  58. #            print(sql)& |# ]3 l* R! ?8 z7 o$ S  I
  59.             cursor.execute(sql)5 b, k$ C5 f, ], ]6 b
  60.             $ Y% @/ O! F8 ~; V
  61.             #qid = cursor.lastrowid
    , X" u; |+ j# e- X# v
  62.             #print(qid)
    " ^$ i9 U9 ]1 ]$ h) ]0 Q6 U, Z
  63.             2 u3 |$ r$ M9 f' _( h
  64.             db.commit()
    0 a: s$ M# q1 b* ^3 }  F( a( x
  65.         except Exception as err:
    8 Y% `  W8 d' z5 j& L" T9 {5 E
  66.             print("Error %s for execute sql: %s" % (err, sql)); ?7 M" E+ u# d$ y$ d0 e
  67.             db.rollback()" x8 F) d* k( \7 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):
    . A- l- C- q& N& R) ?! c! T
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"): a+ u2 V) V: _% X! a! Z
  70.         try:
    0 [- I9 }$ e3 L2 U* A) D$ y
  71.             cursor = db.cursor()& s0 {' |/ ]2 R* `6 V& P
  72.             #注意此处字符串的占位符要加双引号"%s"6 [* t. p* ?8 E6 i8 b* K9 n9 @
  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);2 R1 k9 y" q+ h1 ]& q
  74.             print(sql)# j1 S; ~* h" E9 C  ]$ D$ e1 I
  75.             cursor.execute(sql)
    7 z/ _) g# X+ `, K4 ^& B
  76.             print(cursor.lastrowid)& x7 [2 {) p- A9 c5 t) k
  77.             db.commit()4 K& x5 r0 b2 p! X4 e8 Y- C, w, b
  78.         except Exception as err:
      ^8 E0 l9 M  |+ n/ {' x5 |" z# a
  79. #        except:
    + x+ f- q% Z  W6 y; S+ u! A
  80. #            print('Failed')
    ! H( n( D4 w! |4 }
  81.             print("Error %s for execute sql: %s" % (err, sql))
    . X. w3 s$ `: U2 |) i5 C  b
  82.             db.rollback()
    ; r) N/ ]& A3 w' |0 Q$ l+ E
  83.         , P) y) r# s- l
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    ; l% y$ E6 ~5 c( Y+ O% I7 k4 N
  85.             reload(sys)
    ' |  @; D, C! R
  86.             sys.setdefaultencoding("gbk")' W3 t* o3 ~1 c8 r. r. `! ?; l
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    + o7 Y6 m6 X7 I: u# e0 ^0 k1 t
  88.             locoy_data = {% H; @& R' O# V
  89.             'my_u':'用户名',   #后台用户名: U* {- j% t- R0 G( h; w: }$ z
  90.             'my_p':'密码',   #后台密码
    ; C; q  R# N1 C3 x
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    # X" E% Z8 a# r1 ?6 X+ X2 g
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    0 k* a, Z' j. s% K# f, i0 d! P
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),, N. E2 x3 I3 b
  94.             'article':BookConte.encode('gbk', 'ignore'),
    1 f0 V1 K9 Z/ n9 Z. r9 u
  95.             'author':Book_author.encode('gbk', 'ignore'),$ w* c& M, |) ]/ R  |* P* i( \. h
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),. {$ ^- H' A  X
  97.             'thumb':Book_img," j  z& z+ e4 T1 v
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    % n/ i" l% Y+ _+ M$ Y4 D
  99.             'abover':abover.encode('gbk', 'ignore')           ; J# q' v- y9 X% G, W; I2 X
  100.                 }+ @0 v; I; H  m3 q! P5 Y' a- L% }
  101.             res = requests.post(locoy_url, data=locoy_data)
    / J4 L  G- F/ s' {- [
  102.             print res.text0 f) p/ r% i5 ]' n
  103.             print res.content- ]( C7 {$ o$ S' ~; d8 ~
  104. #            print Dsd- |( m( u  R* f* M% X5 a0 A4 x
  105.             return res# E9 E% B- \8 i2 H
  106.     7 z% |4 V' q( m& `  @4 z
  107.     def __init__(self):7 T3 Y' w5 C5 v' g( t6 G8 M
  108.         self.base_url1 = 'https://www.****.cc/'0 G8 [$ n) o/ k! G8 c6 f/ O) ]' i
  109.         self.base_url2 = '/'. J/ @" F* x  t4 h; x! l# M5 b4 ]  @
  110.         self.CaterId = []
    - P  U& m+ L6 P# o# [, b
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']* O+ z) q# |2 S8 W# Q
  112.         self.page_num = 1
    % @( n/ `; ?' S% e
  113.         self.total_num = 200   
    $ I+ y1 `8 @$ I1 t. D3 y; I9 \3 _, M

  114. 4 {' }2 J+ I: Z; D5 S9 c
  115.     @every(minutes=8 * 60)4 K, i, P7 d. S1 `! E
  116.     def on_start(self):1 l2 _8 \2 `  e! n0 R
  117.         global Cater_Name1 K9 X8 |0 k3 i+ q
  118.         Cater_Name = []) `; @- [% c0 Q7 @7 {* u) P
  119.         while self.page_num <= self.total_num: # B# x" ~' R  [. L+ q
  120.             for self.CaterId in self.CaterIds:
    * ?' t: T2 Y3 y. }8 f: G) X9 E
  121.                 if self.CaterId  == 'xuanhuan':- o( y$ s  r) T) o- I
  122.                      Cater_Name = '玄幻'
    8 u9 p: r' s. d! A
  123.                 if self.CaterId  == 'wuxia':" |" X& r5 W3 a& {# e
  124.                     Cater_Name = '武侠'; T& a7 G0 n2 L5 ?2 l. @
  125.                 if self.CaterId  == 'lishi':
    2 Y% |  w  p6 g* x! x6 y9 \4 E$ E5 k
  126.                     Cater_Name = '历史'            ( U3 @7 Z; M4 H6 }. G% D9 c. T- u
  127.                 if self.CaterId  == 'yanqing':/ x! v9 x6 c4 Y! _7 L0 o
  128.                     Cater_Name = '都市'   T6 X  N0 y, G$ N9 f) I6 D' _
  129.                 if self.CaterId  == 'nvsheng':
      h/ A4 l8 p4 y1 B, L0 [7 d3 M
  130.                     Cater_Name = '都市'
    1 ]' |9 J/ g/ K! Q# s  j
  131.                 if self.CaterId  == 'kehuan':
    " E8 w, ^: j( y( [
  132.                     Cater_Name = '科幻' ( [% s0 b- S- [5 ?& U6 S
  133.                 if self.CaterId  == 'kongbu':
    4 F+ j2 f1 _9 P) Q) R/ W
  134.                     Cater_Name = '游戏' 0 ^% G% v% u( i( m3 W
  135.                 print self.CaterId
    $ }& R$ g; A. J4 J8 G) v2 e* a  B
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    # ^4 |5 I' E  z- e
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    3 d  M( k4 p& R% Y6 ?& y( R2 A! v
  138.             self.page_num += 1
    3 R. a2 {' A4 C% }' {! ?
  139.             ! O( U$ \; M3 j  k' _" ^
  140.     def list_Caterg(self, response):
    5 s* y- C* B) S6 Z
  141.         Cater_Name = response.save
    + x2 r. N& B/ F5 N. d4 j+ e7 Q" q
  142.         for each in response.doc('.pic-list a[href^="http"]').items():2 U# q. W- E- {& d3 `/ U' n
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)% {4 Y' g4 ~; b! O' ]" ?$ q; n# ~
  144.             
    6 ^* p$ ?" o% F9 v: c4 E
  145.     def list_Caterg_detail(self, response):
    1 Z/ V& [1 ?" m- ~$ _, k1 }
  146.         Cater_Name = response.save' y4 \! Q5 \0 z  _6 x9 N. r0 Y
  147. #        print Cater_Name, b6 M' Q! E5 I2 w0 P- [0 K# [
  148.         Bookname = response.doc('h1').text()
    0 a5 D- s5 Q$ T
  149.         print Bookname$ |+ ^3 Y9 J, b# {; a% i, }
  150.         Book_author = response.doc('.authorname > a').text()
    9 t9 \- B8 l# V
  151. #        print Book_author
    0 ^( e6 z4 h; T- ~) c2 T
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    9 Y) ~3 b) V4 E
  153. #        print Book_Introduction7 h. V: g5 V6 u: o
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    ! W) N+ ~" k8 V/ A# t3 `+ `! \
  155. #        print Book_Synopsis
    4 B7 q& O" k' F6 [/ P) Y3 t
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]: u! G  }1 V7 w1 `
  157. #        print Book_Palabras
    % w7 j+ S- j* f) R$ C) X
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    . P  l, v# B0 N& v/ l
  159. #        print BookIDs9 x0 i8 q& R; o: |% }
  160.         Book_Dates = str(datetime.datetime.now())         
    + J/ ^' _  Z5 F5 _% p- C4 ?
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    9 }8 j+ |5 E2 l  M# K* U% H
  162.             img = imgs.attr.src
    7 S, _1 p  Y6 C& m
  163.             print img
    * M, x5 t  G& O* E4 m
  164.                 #小说封面下载
    * b+ T: e4 |+ v, j
  165.             extension = self.getExtension(img)
    / t! Z* G% H# Q( w
  166.             name = self.getname(img)
    # ?1 }* t3 n/ C- U# ]8 a- F' B
  167.             file_name = name + "." + extension; h. e4 K7 t7 U+ D; Z: N
  168.             imgDir = P_dir + name% ~( S" K/ J2 g5 T' b
  169.             Locaimg = imgDir + "/" + file_name
    ; [+ C; r# b% W9 i# ^
  170.             print Locaimg
    : o, z; e! X" F4 t- f8 c' T* ~! g
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    - r8 z5 m, t7 @% m$ z
  172.                 print('attachment url is ' + img)               #3 ~# u( a, ]$ B: l, y
  173.             Datos = {
    $ P4 Q6 [: E0 O. G  q4 L
  174.                     "Cater_Name":Cater_Name,
    ( K! T# D$ S( y' X) z
  175.                     "Book_author":Book_author,7 A8 }2 j2 i- A" }! K) L) B
  176.                     "Book_Introduction":Book_Introduction,# V' I( O9 R7 R
  177.                     "Book_Synopsis":Book_Synopsis,
    * B) L: @* x- j: D* w
  178.                     "Book_Palabras":Book_Palabras,* E! T% q( t5 K% {$ a) ?/ t! M6 A  i" C
  179.                     "img":img,
    3 j2 {, I8 t$ s. s2 \: K  [
  180.                 }
    $ j; R* Z3 t! r8 `
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    " K- x* |; D6 Q9 A' o9 i  v7 y
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():  c- s. ~3 L9 Y2 u
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)7 l' G' C$ e* f4 W
  184.             
    4 Y! i2 N+ e% l2 ], d- k" O8 G
  185.     @config(age=8 * 60 * 60)    . e5 B9 H0 \; @7 E& h' |
  186.     def index_page(self, response): $ L+ w# Y( c6 B$ N- r& P9 A; ^" c% Y
  187.         Datos = {
    + [: U& w( w# p2 K0 j  t
  188.                   "Cater_Name":response.save['Cater_Name'],
    ' p  Z4 }5 {/ q! V8 m
  189.                    "Book_author":response.save['Book_author'],
    7 `, I' k" ]# D5 b! X
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    % M4 Q7 G/ B. x- R/ Y, O
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],. A  l, H7 x; f% H, a
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    ! V* h) i) L* j7 ~2 l2 Q
  193.                    "img":response.save['img'],
    % W0 g" K& U: w8 {  T0 t- H+ T" U& o
  194.                      }" a2 |, u) c  X  k  t* S* q- \
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():6 j6 `( s& p. G4 O
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  , a' I, N4 l! c, v4 g# }) w$ b
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos): E% V% d- _8 v, [  K
  198.     @config(priority=2)
      O5 f8 z: g' J. F+ v0 i9 F
  199.     @catch_status_code_error
    6 U9 E6 C8 e0 P5 U6 `# [
  200.     def detail_page(self, response):        
    " L4 B, A" M& ]1 E( N5 @  P  c
  201.         NewRe1 = u'哈书'& o7 P" \; H  a: t6 H4 T' P
  202.         NewRe2 = u'huhjsd.CC'
    . M$ E; e- [  ?% h8 x$ n9 o: |
  203.         NewRe3 = r'^\\n\\n'
    5 Q4 h" V/ p% }& M+ H; w
  204.         NewRe5 = u'小说网'
    3 [4 y# y8 ]' q$ z- W# d8 e2 e* }
  205.         NewRe6 = u'fgdfgf'
    / \; _3 c) Y/ ], }  I
  206.         NewRe7 = u'fgfgf'
    " B" L+ S; N, c6 O3 N1 n
  207.         NewRe8 = u'ffhgf'
    + ?$ ^" p% Z3 n$ i+ i0 w2 N9 g& m
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    # r/ }% T. |/ o3 j
  209.         ReC1 = u'静思'6 N! g9 n1 F: P. \
  210.         ReC2 = u'aghgf.com'8 X" Q& h& e, B: ^3 E5 n2 h
  211.         ReC3 = u'aghgfh.com'
    % K7 M! P  o7 @
  212.         ReC4 = u''
    ) f) O, r7 K: J  v+ O
  213.         ReC5 = u'文学网'
    4 R0 E0 `* A& @4 i! [, @) i
  214.         ReC6 = r'<BR>'  y$ p8 ?" j/ b8 n( h; X5 ~( t  j) _6 a; g
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称( ^3 Z3 H2 V. U! S2 H5 b1 C( l
  216.         print Bookname* N! p* L% T2 a8 }: B
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类  f+ I( _( R2 m  n
  218.         Book_author = response.save['Book_author']   #小说作者
    & I4 d5 X3 e7 ?4 d& Z
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    ) E+ q: c0 T+ _
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新# Z3 s3 ^* E) t5 s. |/ F0 j* y
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数, V' ~1 m0 d3 H2 ~
  222.         Bookurl = response.url   #小说网址3 K5 R# \) k) h) M4 r* _
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    ) E$ a3 |, J( Y1 Q2 |
  224.         BookID = response.doc('.readset-r span').text()   #小说ID! C3 Y: O- ^  c$ t5 c
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容) V) g2 E& l2 H, D6 c
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    8 h: K2 T( u: p
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    : x) C# I$ H" _  I4 k) ?  _
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)' D8 x1 ?6 {' M$ a; q
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    $ ?6 I) A2 L- N9 A% p
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    + X8 G8 f' f" ]* |
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    # Y$ L) W) U0 Q. N6 s: P+ F
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2): O5 [6 [2 @: }5 V/ W3 r& i
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)$ \3 V/ Q3 ^+ V& q# z& L
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)$ F3 E7 X/ S8 x9 t7 `: y- g
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    - n/ e( J- l# @
  236.         print BookConte
    : p& A! O+ V1 G' F2 ^8 ]3 O/ \
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)+ m# Q* s4 O5 [" J* j1 e% X
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    8 W( n( s  |8 D
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)  j. U. f. X8 f
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)" i; A" u/ R" T  t) R
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     9 j, A- M: x$ P3 P" j( Z
  242.         Book_img = response.save['img'],  #小说图片
    4 d7 Z$ S" W( v
  243.             
    4 i, Y4 {% o( @: `$ ^9 _7 ~
  244.         #insert into MySQL 小说入库
    ! q# U6 W' K. I- x
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    3 s' ^- {% Y& ?2 B$ z8 W6 Y
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    % i+ w+ X, z/ d( s- B8 R+ g  j, q' |
  247.         #post提交发布# e" |3 H' E  @8 x- {1 b3 E
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    : R% [: k& x: Z5 A1 |1 S4 }
  249.         Datos = {' e2 x) L8 g& Z0 p
  250.                   "Cater_Name":response.save['Cater_Name'],
    # i: X5 n0 X' C: x
  251.                    "Book_author":response.save['Book_author']," M* N, O$ S8 k: p7 @* p
  252.                    "Book_Introduction":response.save['Book_Introduction'],' A# O" M7 ]2 f' C. H
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    + F! t  k4 [- ?3 `. Z8 q  z1 O0 N: e
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    : D. D1 ~0 I, `
  255.                    "img":response.save['img'],: Z- T' y; v- }9 E) v. u8 b
  256.                      }
    6 K$ |5 E9 W; |( z% y$ F* Y! O" _
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():# Z9 X+ a4 q( m" @
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) & P2 i5 `6 I' _* k
  259.         return {7 T2 A2 R" b! {# _! W
  260.             "Cater_Name":Cater_Name,
    . Z  F2 M# M- S( y' K
  261.             "Bookname":Bookname,
    $ b0 S! w: k2 b' i' i
  262.             "Book_author":Book_author,
    0 }3 _, ?! G% Q- m; `
  263.             "Book_Introduction":Book_Introduction,/ Z: o' o- q. u
  264.             "Book_Synopsis":Book_Synopsis,# b# ?5 Z/ P: r
  265.             "Book_Palabras":Book_Palabras,
    6 D7 d. A2 P# G# ~- Q! R) X5 n$ L* z
  266.             "Book_img":Book_img,  {- T, t" k! @5 m& }
  267.             "Bookurl": response.url,
    6 j" z& k8 f/ E/ L; Z% }- v$ k9 |* l
  268.             "Booktitle": Booktitle,- b( j' G' q4 C. V
  269.             "BookID": BookID,, G' _1 r* K( X. ~
  270.             "BookConte": BookConte,- L7 i. Q  d6 r: o+ Z9 V
  271.             "Titleid": Titleid,( G: I! G8 y- w8 t& y
  272.             "abover":abover,# j( b. I! R8 \+ [$ a# B. i7 C
  273. #            "Book_Date" = str(datetime.datetime.now()),
    : v, d2 i& w- @7 o; U9 Y5 x7 j; T
  274.         }4 H/ `; U4 h# d0 l8 s* @
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    / P5 M+ X! s8 x2 Q8 m8 b4 Y. }
  276.         if not os.path.exists(imgDir): 8 H/ X; c8 z1 d! J& c6 h9 h
  277.             os.makedirs(imgDir)6 n. m0 Q3 h& |
  278.         file = imgDir + "/" + file_name( x6 |% ~4 ~, i8 K; }8 D$ T
  279. #        print file4 X3 o5 c& H- E! ^9 y) ?1 f1 A
  280.         f = open(file, 'wb+')
    / {: f3 Y1 o8 P4 ]$ h: H: \& T
  281.         imag = requests.get(Book_img)
    5 a  `3 g7 l+ Z+ v9 X; ^- j( Q
  282.         f.write(imag.content). g" M# _! t! i5 A
  283.         f.close()
    6 L9 M0 R' E1 S( I4 f' j. I* g
  284.         #保存图片前* g, N- N2 o2 m8 Y0 I
  285.     def save_imgs(self,response):6 A7 N6 C2 b& K" D0 v( N. O) e
  286.         content = response.content2 h# }& \+ p" u
  287.         file_name = response.save["file_name"]
    & P: O: X6 a, i) [( a, A& q- \
  288.         imgDir = response.save["imgDir"]
    + Z! [9 A: o7 ~; p# |# k& [
  289.         file_path = imgDir + file_name) X( |2 h1 u, b; U" k( d
  290.         self.save_img(content,imgDir,file_path)
    & Q4 q+ g5 u3 @; q
  291.     #保存图片
    7 Q7 X' \: A0 p$ @5 W' @
  292.     def save_img(self,content,imgDir,path):( U5 q& n( M: E* U3 X
  293.         if not os.path.exists(imgDir):                         3 {. g1 L! z1 s
  294.             os.makedirs(imgDir)
    & k. }2 b4 r9 n( E2 {5 ^
  295.         f = open(path,"wb" )5 t& t; B$ g1 P0 w
  296.         f.write(content)8 X* Q, x9 M! m3 O' w
  297.         f.close()
    3 Y/ T0 c5 e4 |* z' r% ?2 S# v6 ^
  298.     #获取url后缀名
    , j6 Q% @2 n* Y( P: Q" b
  299.     def getExtension(self,url):                           
    1 j- _2 F9 z' U: ]
  300.         extension = url.split(".")[-1]% M7 k6 Y9 U# e$ ?  \
  301.         return extension
      H, i( w4 B: c5 ^* X2 Z
  302.     ( N' ?% e+ Y  d2 U' w
  303.     #获取图片名. F6 ]2 C4 e4 z5 F
  304.     def getname(self,url):
    8 a" z# e% W6 p/ j3 r
  305.         name=url.split("/")[-1].split(".")[0]
    , g' S7 w6 F3 n" A2 ?
  306.         return name
复制代码
( C+ \  G: [! g6 D% e
( \% r1 |* ?$ W5 @" y( e
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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