找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
0 |% o0 q6 R* P0 n
  1. #!/usr/bin/env python: R+ H; o) |8 N
  2. # -*- encoding: utf-8 -*-
    / l; `0 P, M# y+ n
  3. # Created on 2019-05-05 21:43:11
    , M& v( _$ k6 E9 i. P; b! M
  4. # Project: XiaoShuo
    & u1 n, ~. h; Z0 n

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

9 F$ p& U# D6 Y
; Y- ~2 a$ w( A: X3 y  R; o3 I% P
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-31 11:22

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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