找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!4 v$ z& N9 v* N0 I4 I
  1. #!/usr/bin/env python
    . R/ z) g" E( ?$ E
  2. # -*- encoding: utf-8 -*-2 k0 Y; y6 x5 p9 o
  3. # Created on 2019-05-05 21:43:119 l: t, S6 z# a, k6 B& H- |
  4. # Project: XiaoShuo' h& l7 H' P1 c4 b
  5. $ n* |& C( \8 C2 F
  6. from pyspider.libs.base_handler import *
    4 z( y% E" E( X
  7. import pymysql6 @/ k6 j- u+ R9 Q# m4 F) G2 h
  8. import random
    + r3 V6 }- j7 g, |" g" L
  9. import datetime
    3 i& N; Z* H+ S; Q% [" c! j
  10. import urllib2,HTMLParser,re
    1 x4 r. C2 q% Q) j- G4 B
  11. import os0 I% D: V/ i2 e7 ~. P: D# V4 _
  12. import sys4 L* O# c! Y* I+ N4 c
  13. import re
    0 R) e( h1 u' @" g) C
  14. import codecs
    ) [3 H. N4 w$ u4 s; I1 g4 [
  15. import requests! {4 D" V3 @: V/ n% g
  16. import json
    7 B- E0 b* K( [- O8 d% ^& U9 V
  17. 1 L' _- l8 |2 V  b  J. I6 A
  18. class Handler(BaseHandler):
    6 U$ l" T& h6 Y( g+ G1 ~1 x+ h
  19.     global Datos( O0 N& D2 O( Z
  20.     global P_dir    8 E: c3 P/ n$ R, |; L- |" _9 M
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径6 V' [& T3 l( P
  22.     global Datos0 ], c$ G9 Q/ k4 J2 E
  23.     Datos = {}0 @' o% @6 G7 p; F
  24.     headers= {
    + u: q. I6 L' n8 ?5 k+ t5 q: E( e
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',/ P7 g# _6 B: l; e' U4 T0 R
  26.     'Accept-Encoding':'gzip, deflate, sdch',8 k: _+ y7 m  }: Z
  27.     'Accept-Language':'zh-CN,zh;q=0.8',) l9 l6 r+ u% Q# N
  28.     'Cache-Control':'max-age=0',
    ; _3 W1 y/ ~% t
  29.     'Connection':'keep-alive',1 P0 R4 Y9 n& p/ D& F# p  C, @
  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'
    % C5 b* e& V% \, d8 V$ L$ r
  31.     }
    ( `4 P- n% ?  q7 w4 y
  32.     crawl_config = {
    ! t1 ~; J/ e: i8 ^9 |: k$ X: ~
  33.         'headers' : headers,' ~/ `* J# J! e; J
  34.         'timeout' : 300
    $ m, g1 D) W* N8 Q, I* m/ e1 ~  R
  35.     }# z  ?: E' B6 e' b8 x0 R2 T- K% ?0 K  y
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):( [" Q2 P% [+ v$ F  y
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"): ]4 U( z* u* a* }) k& J9 j2 k
  38.         try:; R- G. i7 X* ?9 Q: k
  39.             cursor = db.cursor()" i: Y6 h+ Y1 |/ N1 D& J7 W, }9 o
  40.             #注意此处字符串的占位符要加双引号"%s"
    ( \9 V' T- F  i
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);: z. D2 J* H; z8 A$ j
  42. #            print(sql)
    5 D# }6 V0 ^% }
  43.             cursor.execute(sql)* Z/ \; @8 g& J0 a9 e( G
  44.             3 f' @% |/ H8 h) o
  45.             #qid = cursor.lastrowid
    ! d, t/ N: g. {0 `* i9 o
  46.             #print(qid)
    ! b% R, r) e" Y& D0 K
  47.             7 O; e/ c2 ?" p& F* b- p
  48.             db.commit(); G- P, ~2 t* Q0 Z  y# c  D
  49.         except Exception as err:
    ; W9 Y/ H9 x* I, }  ~) }; D% H% F" ?
  50.             print("Error %s for execute sql: %s" % (err, sql))! C5 P9 s4 |6 p) W3 A- m% |
  51.             db.rollback()
    - p8 T" D5 d4 F6 a( |! n
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    3 V+ ^3 O$ z) W) K5 t
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    ( t# z% [8 J1 \* s; A4 J
  54.         try:
    . H- z( s% b0 c9 m, {0 {; ]% Z6 _
  55.             cursor = db.cursor()
    ' i2 u- x9 m0 Z  y0 N! D7 P
  56.             #注意此处字符串的占位符要加双引号"%s"  q9 E# [9 L6 X7 v- q% r
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    : _/ v% N4 `/ |% g4 z2 P6 D9 \1 s* d
  58. #            print(sql)4 q/ |, u! _7 }2 v
  59.             cursor.execute(sql)
    2 k3 b9 A0 u; H6 k7 M2 O& B6 M
  60.             # r" z& w8 B0 j' k9 E; ^; P/ L
  61.             #qid = cursor.lastrowid, D) t$ G+ h1 Y  n- m
  62.             #print(qid)
    7 l# K6 l+ v( K8 W4 L+ f! |
  63.             / m+ A/ \7 L# z* t7 o
  64.             db.commit()
    ! ?: \7 p$ ]/ Y5 Z6 T7 ?5 k
  65.         except Exception as err:# ~: V1 `& y% Q( O7 f
  66.             print("Error %s for execute sql: %s" % (err, sql))% k) n1 M! d/ E( |4 ?# p! d
  67.             db.rollback()
    $ C: D, Q( Q8 R- [" G6 s) n/ c
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):
    4 t/ p4 G' ]5 R: a: |: i9 F/ n* s
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")8 L: {5 o: k. [3 o
  70.         try:# c, W$ v" l! Z
  71.             cursor = db.cursor()
    8 R( I4 w9 E3 t7 f
  72.             #注意此处字符串的占位符要加双引号"%s"
    6 C5 Y' G/ w% `* B! D
  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 O0 H5 c3 H. \) Q1 r
  74.             print(sql)3 N+ Z7 n5 {+ ]  j% Q* L0 B$ T6 h0 w
  75.             cursor.execute(sql)
    / Z$ i3 ?8 k% C  n
  76.             print(cursor.lastrowid)
    8 m4 @. o: W" c6 T; b# Q5 m
  77.             db.commit()
    , l* Q* G( X/ w1 W5 r; U5 d
  78.         except Exception as err:( |6 _' }  ^- B5 P* l
  79. #        except:3 D. H' f- ?8 B$ k  {) M& C
  80. #            print('Failed')
    & E4 H! F9 n. O6 L$ c
  81.             print("Error %s for execute sql: %s" % (err, sql)): H2 ~2 f! M* Q" J, w% i
  82.             db.rollback()
    $ h' i! A: w8 _% i6 |6 y) ?( v8 t
  83.         & p! F' R% b4 ]
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    * d# P" x* w+ k) B0 a7 k! [6 K2 g, w
  85.             reload(sys)1 x. M2 y. z7 K8 x
  86.             sys.setdefaultencoding("gbk")
    8 D7 z2 I' [2 W( r  k
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    . I) ?) I* N$ d4 u2 o' X/ n
  88.             locoy_data = {& G/ c+ V* }) X8 ~1 Q! p
  89.             'my_u':'用户名',   #后台用户名
    3 @7 n) _; P$ F2 o! X1 s2 Q# K
  90.             'my_p':'密码',   #后台密码$ |+ @6 l) @/ \" u' I  o
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),. v# S1 |3 q/ ]6 r% g; s
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    " s; K- i8 ^8 X5 g+ ~( s! \
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    : B. `  R0 S: B  N' X! a( z
  94.             'article':BookConte.encode('gbk', 'ignore'),; u( z0 R- L) U$ ?* V3 N3 S, G, |
  95.             'author':Book_author.encode('gbk', 'ignore'),
    # q! w7 ?$ D/ {5 l* z# t
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    " h, Z2 q0 X  q: e
  97.             'thumb':Book_img,
    : g5 I5 M. A2 v+ p+ J
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),4 q' ?1 j3 W- ]# ]3 j; g
  99.             'abover':abover.encode('gbk', 'ignore')           - i8 m% c$ s3 k! S& u2 O5 l2 j
  100.                 }; M1 n6 A  P2 w9 j4 L% @
  101.             res = requests.post(locoy_url, data=locoy_data)8 Y/ F* j" E. J
  102.             print res.text0 a: f# A- j3 i- B
  103.             print res.content
    0 Q" L3 L" r/ ~0 D/ I
  104. #            print Dsd- e% t/ U, ?# Z& H  d
  105.             return res
    / t4 l$ q; {: @3 M. h# w( T
  106.     7 y3 g! P3 v9 Z7 o+ s% [/ Y, q
  107.     def __init__(self):( E7 O6 ?- }, X- [5 A- v4 ]
  108.         self.base_url1 = 'https://www.****.cc/'( H9 R! v, \9 F. s! g5 z8 o8 |. x
  109.         self.base_url2 = '/'
    8 q. Y- O2 _# C' k5 Z
  110.         self.CaterId = []
    7 r2 J( z8 C% q6 P+ j: l
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    + e/ ]8 H5 m: l. T, C/ x) J" f4 ^
  112.         self.page_num = 1
    " \$ w6 K+ b2 _, b$ n* A
  113.         self.total_num = 200   - B4 v+ p8 @% \* D  g

  114. 8 z4 ~# L+ s5 v/ L, i/ |
  115.     @every(minutes=8 * 60)+ u; [' X: w: r( p% i
  116.     def on_start(self):
    * \- }8 f/ g0 Z
  117.         global Cater_Name* m! d- ~, r& N% j/ X8 Q
  118.         Cater_Name = []" Y$ d2 ^# P. A" V; R5 d/ d! B3 \
  119.         while self.page_num <= self.total_num: ; A0 E9 {' W9 f7 }7 m4 y
  120.             for self.CaterId in self.CaterIds:
    , q7 E" u0 T7 r4 X
  121.                 if self.CaterId  == 'xuanhuan':) L' [% ?! t3 r
  122.                      Cater_Name = '玄幻'
    ! ?) h  g6 G5 q4 Z; _8 A  |
  123.                 if self.CaterId  == 'wuxia':
    0 x, ]7 c: k! t* r/ m% h+ I& k
  124.                     Cater_Name = '武侠'" T4 f+ _9 J* y
  125.                 if self.CaterId  == 'lishi':
    $ M; ?& X; E! t/ @$ ~
  126.                     Cater_Name = '历史'            + Q, S( N0 f0 n5 \  D( f. A" M- J
  127.                 if self.CaterId  == 'yanqing':4 h% x: U( }; b4 v7 `9 l. r
  128.                     Cater_Name = '都市' 9 R3 x9 J  z. U8 S
  129.                 if self.CaterId  == 'nvsheng':" s- w1 |3 b4 Q3 R
  130.                     Cater_Name = '都市' 6 I# U% q+ ?0 }( \
  131.                 if self.CaterId  == 'kehuan':; N% O0 Z+ }6 ^  G2 I+ C5 ]
  132.                     Cater_Name = '科幻' 2 [2 v) d% ^! [/ k
  133.                 if self.CaterId  == 'kongbu':. Q+ q* a4 q6 D) m3 G
  134.                     Cater_Name = '游戏'
    0 J$ a; V* a, X$ p+ H% ^
  135.                 print self.CaterId7 e; w; b# q% E- r/ K! P
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          8 Y0 S& W4 X4 A! S# L  p0 f. H
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)( v, d! r- ^  n+ H+ G
  138.             self.page_num += 1
    ) j; T4 m: [% q( q2 C1 t7 p
  139.             
    8 Q# V  T' p+ q' F3 W6 w
  140.     def list_Caterg(self, response):$ f9 \; Q0 }; }
  141.         Cater_Name = response.save7 M; `5 S$ ^  ?2 M1 Q- ~
  142.         for each in response.doc('.pic-list a[href^="http"]').items():
    : ^4 |+ K. L1 g
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    2 m  y% _9 T/ l% x
  144.             
    5 X3 K$ ?9 v0 w0 l
  145.     def list_Caterg_detail(self, response):( \- w6 @( L3 i/ s+ \" G
  146.         Cater_Name = response.save3 o# C  Q$ M! U: t- R+ g; e
  147. #        print Cater_Name
    2 J  c; ?9 l8 r0 l8 f, ~
  148.         Bookname = response.doc('h1').text()
    ) b6 {& {. R4 [2 }6 n
  149.         print Bookname' F9 G5 N9 t9 z  g+ Z
  150.         Book_author = response.doc('.authorname > a').text()2 K, T/ M0 p7 [3 ~& U! M0 k
  151. #        print Book_author
    7 q: I4 `# X; n0 h. J
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    3 Z# Z5 H6 p# w
  153. #        print Book_Introduction
    * z% F; P3 S9 L: O) C5 I
  154.         Book_Synopsis = response.doc('b').eq(1).text()5 J) F! T+ G* b' A# M* ^; q3 N, y
  155. #        print Book_Synopsis
    ' |8 T5 ]5 z% q" m3 p' d
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]
    : G1 K, E, x0 b9 s. W4 M$ B
  157. #        print Book_Palabras& H' Q$ H3 o0 Q( O
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    0 @1 J0 D. ~: Z
  159. #        print BookIDs3 X# T( f4 J; v  w/ z5 c( w5 \! @
  160.         Book_Dates = str(datetime.datetime.now())         8 e1 R- ~2 K6 g( T
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():$ H' n" s/ r; z3 H7 {8 D
  162.             img = imgs.attr.src) w) [" ]; H0 ^
  163.             print img
    / N( b! W, ^" c2 l& `$ ?) X
  164.                 #小说封面下载
    5 T5 N4 \2 S9 V; P- W- E, E
  165.             extension = self.getExtension(img): z1 u5 X8 E8 V( `
  166.             name = self.getname(img): p2 R2 K. \) v
  167.             file_name = name + "." + extension
    " O  R3 ]. ^8 V/ @5 U
  168.             imgDir = P_dir + name
    / G, |9 y6 r. s1 q5 X( p
  169.             Locaimg = imgDir + "/" + file_name
    # J( D5 D2 S' y, Z" ?
  170.             print Locaimg
    % v! y3 F6 X' S2 s9 r& x6 O6 g
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    2 a4 P  ]4 ~; r* \) O
  172.                 print('attachment url is ' + img)               #
    + q+ x0 `! r& x1 @- s* L
  173.             Datos = {
    ) K* c8 k5 L4 f; F
  174.                     "Cater_Name":Cater_Name,. j) K9 ?7 R4 g
  175.                     "Book_author":Book_author," O, M& g3 ?5 J: B: s
  176.                     "Book_Introduction":Book_Introduction,3 Z* a. T# {6 r
  177.                     "Book_Synopsis":Book_Synopsis,: N' H) }7 _$ Q6 U3 D
  178.                     "Book_Palabras":Book_Palabras,/ D/ P/ W2 u! T- v5 d* L
  179.                     "img":img,' c# B+ g2 D' l. L, _1 V
  180.                 }
    0 C  H7 T4 i+ d3 ~! Y6 i  T  s
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    & z) ]) G8 x& i, d7 `
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    2 \" K; t6 ]0 _" E* M" \
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    ' W0 x+ ^3 l4 u' ~6 t6 e! e
  184.             
    ) `& P: Z' B$ h0 d! p+ C
  185.     @config(age=8 * 60 * 60)    & v5 \& q) L0 p- a( Z. H& l
  186.     def index_page(self, response):   W8 Z" Z7 p( T! b8 Y; A
  187.         Datos = {
    ; Z7 M: K2 O9 c* W4 X- Y" H
  188.                   "Cater_Name":response.save['Cater_Name'],
    1 r* j/ K7 V  E" K$ W( D2 u
  189.                    "Book_author":response.save['Book_author'],
    6 {4 n6 L9 U$ C6 N, L
  190.                    "Book_Introduction":response.save['Book_Introduction'],9 }7 o9 H  q% q1 e
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    7 ~, d9 Z* f* o1 {' ?) j7 ~0 ^
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    7 T$ Z: `" z3 f# |( i7 e. m- ~
  193.                    "img":response.save['img'],
    9 |/ ]9 J- R4 S4 M& J
  194.                      }9 w- i- x; n. b$ m% I* U' E
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    % Z, w  S+ |) O8 \; \6 Y
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  # j- E8 ~( m6 d0 v. I$ v
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    - |; \  q1 Z0 Y  z- T9 q
  198.     @config(priority=2)
    ( o1 D) K0 x! K# k2 m- V: z
  199.     @catch_status_code_error+ h8 y7 M8 X8 Q7 I1 n7 _+ E  d- [7 p. A
  200.     def detail_page(self, response):        # {$ I4 l3 O! K
  201.         NewRe1 = u'哈书'7 s0 ~6 z; m- F# A" q7 V, k9 |
  202.         NewRe2 = u'huhjsd.CC'2 ]4 q) o! J; }- a
  203.         NewRe3 = r'^\\n\\n'
    5 v4 Q! T5 P% W5 C6 q+ M
  204.         NewRe5 = u'小说网'
    ) ^& C' |" ?. ?2 ^' T
  205.         NewRe6 = u'fgdfgf'' h0 J1 P  v# l1 F# Q
  206.         NewRe7 = u'fgfgf'0 ^- D  ?* f$ w; F9 f, [8 I# @
  207.         NewRe8 = u'ffhgf', j8 H' Y( g3 J: ^% l3 d
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    - C# y- E* T2 J: @  r- B- v
  209.         ReC1 = u'静思'
    & y$ D% r/ t7 \8 u/ t
  210.         ReC2 = u'aghgf.com'
    : m4 ]( v! k4 u# p  f  M
  211.         ReC3 = u'aghgfh.com'. K  Q  c) _# J6 ]8 W7 C
  212.         ReC4 = u''7 C9 y" x8 d: Q5 X4 N
  213.         ReC5 = u'文学网'
    ! L* F! a* c' M- g
  214.         ReC6 = r'<BR>'
    1 ^1 g$ l5 S4 [- p# I: H" L. Z% y
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    " u# n6 x! }/ C# ^( K+ D' ~4 T
  216.         print Bookname; F0 K' w: W1 O
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类% e  `* o% Z) h8 m
  218.         Book_author = response.save['Book_author']   #小说作者/ M$ h* Z2 I7 @" X- o
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介- M1 T: z% l  v. u4 [& H2 {
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新0 K' W0 k# v( d  b  d0 Q# D
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
      b$ y, q* Q+ T3 D; g
  222.         Bookurl = response.url   #小说网址
    $ H& f1 w8 g6 S& r' k+ B
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    $ H) U$ `& I( [  Y1 u2 s
  224.         BookID = response.doc('.readset-r span').text()   #小说ID  e* Q1 ?- r& H4 j( i4 B5 |& g% B
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容- I9 A( b$ p3 M# L
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    / S) P  Y+ _* n7 y% w! }
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    0 E5 x5 v! f: @7 B/ j: J
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    - P4 r0 i  N4 j$ C3 f* k9 v9 ~
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    4 w# @& h; ?5 F$ a7 I
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    6 B) ~( Q3 q+ p& h7 l# V2 F; r
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    * O' S# G8 e& v% m
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)0 ^/ C& a+ W2 d# \  T. g5 F
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    3 W: E7 ?2 y- V
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    0 d2 w2 e  A0 D+ g
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    % l' E3 L* \  u, M
  236.         print BookConte! B8 f+ M0 i9 ?1 C( v/ p2 e
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    - Q/ a" i4 D7 a6 @
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    ' m! q- J- O) v% H9 ^5 Y
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)
    ( g" E* i2 l, F$ v. T: @
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)' w/ c3 {/ \2 D# l+ D
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     ' Q. G- ~* x8 P4 h2 i
  242.         Book_img = response.save['img'],  #小说图片
    ( a8 B- X+ U3 D9 S3 `
  243.                g" O0 D9 W/ Y
  244.         #insert into MySQL 小说入库
    . S- D. v! [$ m- R6 A
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布: c0 ^6 V9 g% _$ s* u% I
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布; _! g$ W2 ^% @
  247.         #post提交发布, u" f# d8 k0 t2 l0 ~
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    0 f! o5 n+ N2 C3 e. M- c: c5 n
  249.         Datos = {( ?  W( l) v7 w+ z
  250.                   "Cater_Name":response.save['Cater_Name'],+ i0 O% d: b) @+ X% j$ C
  251.                    "Book_author":response.save['Book_author'],8 I8 Y8 Q! E: q% n4 C
  252.                    "Book_Introduction":response.save['Book_Introduction']," z) p  ^, W' j+ K# d' h
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],- M/ u3 f* ?5 Q( Z5 h% C
  254.                    "Book_Palabras":response.save['Book_Palabras'],3 ~6 f/ \7 H8 t  D6 e" L% |& d
  255.                    "img":response.save['img'],
    . W. d* Y/ ~$ N- n
  256.                      }
    & D+ I! q8 t" t5 y
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    5 F5 [2 {9 R, Q- q8 K
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    1 t; b9 [4 ^7 s! ^
  259.         return {( g! H4 _5 [/ m' i
  260.             "Cater_Name":Cater_Name,
    " L* n2 p- V% b( A$ l, S
  261.             "Bookname":Bookname,' ~, U  ?# d% k
  262.             "Book_author":Book_author,
    ; ?/ k8 v" m; C% X: Y: B  H) e: B
  263.             "Book_Introduction":Book_Introduction,
    $ w2 z( c; e; G
  264.             "Book_Synopsis":Book_Synopsis,
    / r! b4 e0 s8 Z: L7 A8 @
  265.             "Book_Palabras":Book_Palabras,, I" m9 J: {- d+ S  y4 C7 w
  266.             "Book_img":Book_img,* ^1 p9 Q) m) t
  267.             "Bookurl": response.url,2 L. l) o/ _) B( A  }
  268.             "Booktitle": Booktitle,' {5 o8 m& g5 c6 Q" L, n, A
  269.             "BookID": BookID,
    9 {: @7 p6 V" S# B7 k7 N% k% `- R9 v
  270.             "BookConte": BookConte,
    $ j/ e; ~8 y5 ^: e8 C( Y( r
  271.             "Titleid": Titleid,
    + }% H* C8 ~! i$ b9 Y
  272.             "abover":abover,/ ^2 @$ j4 B9 p5 N4 d
  273. #            "Book_Date" = str(datetime.datetime.now())," E8 \5 N/ }7 B! q& f
  274.         }, F- H) E5 P" N9 `+ r; V
  275.     def download(self, P_dir, imgDir, file_name, Book_img):
    $ z) S4 U3 h+ J5 i2 P
  276.         if not os.path.exists(imgDir): * \7 }* [" W, ^; y
  277.             os.makedirs(imgDir)
    1 m0 f1 \$ c* h$ }+ x- E
  278.         file = imgDir + "/" + file_name0 r5 |5 P. i# u, R, b3 ?
  279. #        print file
    - q( D! [7 i7 E
  280.         f = open(file, 'wb+')
    $ Q! E) I) k7 s4 r1 `) P% t# o: a. Z
  281.         imag = requests.get(Book_img) ( k1 h7 E6 B: `/ {( p: V7 M8 {4 A1 t$ I
  282.         f.write(imag.content)& K( u8 H5 {) H/ c# R
  283.         f.close()$ J# Y$ p( V8 g: l0 X
  284.         #保存图片前6 s/ V) [' [" `1 Z4 K
  285.     def save_imgs(self,response):6 L# x  B0 ]- l- |5 N3 w1 x
  286.         content = response.content
    2 r5 B3 e) Z1 s; E2 a4 N) s
  287.         file_name = response.save["file_name"]
    7 S3 m- A/ [4 F0 a2 o
  288.         imgDir = response.save["imgDir"]: I1 ?0 e9 i* u" w9 n: \' Y* `8 v
  289.         file_path = imgDir + file_name  C: U! A" `+ U; [
  290.         self.save_img(content,imgDir,file_path)
    . N, p$ Z* L8 V' }
  291.     #保存图片  m3 O5 ?) Q( M% J
  292.     def save_img(self,content,imgDir,path):
    . n$ ?& K; I0 I" o& p
  293.         if not os.path.exists(imgDir):                         ' y" t5 ]( {1 a+ o+ ^; m
  294.             os.makedirs(imgDir)# m9 S% A1 R4 ]1 }3 S
  295.         f = open(path,"wb" )
    ; }5 d' R$ m, G5 p  V, L; M" _, n+ r
  296.         f.write(content)
    6 D2 d2 M( s" L0 \
  297.         f.close()+ O: s6 D+ W- z) c  f+ k3 u' _% n: q
  298.     #获取url后缀名* X* h& k" U  n# d1 L& l
  299.     def getExtension(self,url):                            1 n- v, U' E$ T- v
  300.         extension = url.split(".")[-1]) c. v0 K% }! R: m, b+ C
  301.         return extension ( \( R4 C& z% n4 X" S
  302.    
    - i. e5 r5 q* F) M( n
  303.     #获取图片名
    ; G% f' Q/ R1 Y# M4 \) W$ `6 k
  304.     def getname(self,url):
    ! ^9 ~  L4 M4 B6 s& c, k
  305.         name=url.split("/")[-1].split(".")[0]8 h0 o( s' w/ L) h! M7 q; i9 i
  306.         return name
复制代码
3 v; Z; A2 I! y- a3 b

: c5 A5 m. @- K2 m$ z% {
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-5 15:12

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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