找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
0 A6 A; x2 H3 ]- H3 P2 R1 t
  1. #!/usr/bin/env python
    ! l# P4 q& f; l0 F' [
  2. # -*- encoding: utf-8 -*-0 H4 ^) Z+ \. m: W; {) W4 m/ j8 c) R% C
  3. # Created on 2019-05-05 21:43:11
    ' C( t& g1 w6 a9 J9 ^7 X
  4. # Project: XiaoShuo, @: O/ |7 t( W0 R2 z

  5. ; L% R- M) q- Y! r- E  s( O* g
  6. from pyspider.libs.base_handler import *
    # s+ K4 z0 i  {' `! m8 s
  7. import pymysql
    ) g% S: c3 |0 G3 |
  8. import random8 B1 F/ H5 }5 o4 T) V# R7 P
  9. import datetime0 r4 e+ x7 A# P2 W3 m. ]* ]5 `- E. M
  10. import urllib2,HTMLParser,re
    0 B# Y' \( O( ~% o% z# D% L' U
  11. import os$ f5 r6 V* `' c& G* S5 J
  12. import sys
    : z" C, X) F% U' G8 w/ h
  13. import re
    - _8 C; Z: ^9 M" q  _+ `
  14. import codecs
    2 m3 X4 G& W/ T8 H9 H$ y) _
  15. import requests
    " Z8 V) b: ]) Y/ e) C+ I" G* e
  16. import json% O5 u, q. o5 w

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

% q5 s  X/ {1 z$ H/ F( @

# g0 f* R% N& ~/ q4 o+ i  }2 o; |* Y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-9-22 07:00

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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