找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!& t- ]7 s% e: {* Y% I; V
  1. #!/usr/bin/env python6 B6 \9 D& D# F% h, i( `  A3 q& M
  2. # -*- encoding: utf-8 -*-9 I+ C: w( V  R1 Z3 X$ g
  3. # Created on 2019-05-05 21:43:11) ~: X& n7 z- s* T
  4. # Project: XiaoShuo. {9 Q  z6 Z( w
  5. : O% n1 h* ?& E! P+ |
  6. from pyspider.libs.base_handler import *
    ) q) y, X+ z6 n3 w- c; K
  7. import pymysql
    8 K6 d1 a( s1 W$ ~( n! ~& F# u
  8. import random5 I; B( w+ R& M4 e3 B$ M, c
  9. import datetime
    $ V  M9 j3 ^3 v9 j' s' S
  10. import urllib2,HTMLParser,re% U! `- q' R* G! ?* j
  11. import os* b9 B: G! B% \
  12. import sys, f; M* z/ B' J8 @/ _1 B
  13. import re
    2 z  \2 \1 G+ Y. d
  14. import codecs
    2 J" v! }8 f, ?2 X7 Y: V; L
  15. import requests# W  T) Y# v" D8 ]$ D0 t( ~
  16. import json
    . ^9 y0 s  [% J- m$ i1 V
  17. $ S3 z0 k3 r$ ]# b6 ]
  18. class Handler(BaseHandler):/ `# P" n! R+ O8 B. I  X
  19.     global Datos! U, D4 j8 t$ y6 W4 d
  20.     global P_dir    5 j- \; ^/ ], }
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    5 w$ D/ S( b- s# w6 r6 U/ t
  22.     global Datos
    ' A$ ?  J3 ?; H" \
  23.     Datos = {}* a7 q$ Q9 e$ v2 C, y. m$ V( v+ V) J( c
  24.     headers= {
    # f# u2 J* p. q/ W+ }8 W
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    & X, k5 f% |2 N, K
  26.     'Accept-Encoding':'gzip, deflate, sdch'," n" B9 j2 e. H( c: f
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    % G) i1 C) @- Q; {# d
  28.     'Cache-Control':'max-age=0',
    4 t" n# ]* b+ I, }+ F
  29.     'Connection':'keep-alive',7 _! q9 j( a* W- b9 p6 V( H+ N' y
  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'
    % T7 Y3 q! C: x8 y
  31.     }
    1 w; J, R8 `& p4 g: f9 k6 S5 h( i9 X
  32.     crawl_config = {) u& u/ f( `( k* i' M
  33.         'headers' : headers,# s" G& Y+ ~( {# P7 i0 I1 c
  34.         'timeout' : 300
    6 @2 i# O6 T' [6 S5 s8 q! P
  35.     }
    ' v: X% I) }7 e- V9 `: \3 ]4 G( z
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):
    ( N3 Z% g) ~8 \2 S
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")+ X2 H7 J" D+ C. O6 }
  38.         try:1 {; ~& P2 M8 V. D- b
  39.             cursor = db.cursor()
    1 t3 M2 d: `1 L% o( s- Z; \
  40.             #注意此处字符串的占位符要加双引号"%s"
    0 q/ M" @% s# q1 P" K, e3 e3 @
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    5 Y) ?8 U6 g  n# h6 W
  42. #            print(sql)
    * C; S, F' S+ A/ p- s9 T
  43.             cursor.execute(sql)2 x! l' G/ j& U# I
  44.             . I8 \( M7 G2 Q' q$ ^& T* Q
  45.             #qid = cursor.lastrowid/ [9 E3 S! @# ~% k5 J
  46.             #print(qid)0 h" j* U" W* [
  47.             1 o- B8 b6 k2 z! C$ q' `
  48.             db.commit(). I3 I* z0 R* n' I' y4 ~! G" i# N
  49.         except Exception as err:' }! A$ N2 ?$ k8 w
  50.             print("Error %s for execute sql: %s" % (err, sql))3 \' z2 u# x' d6 @" w3 a
  51.             db.rollback()* b+ j$ [( _! ?& O
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    0 D/ r; K* E$ C" d! \9 w
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    7 h" E- p: H8 T5 L8 a$ T9 H
  54.         try:
    " \! A5 c9 a$ Q  P5 G5 ?0 U& J( [
  55.             cursor = db.cursor()% s% K+ N# i- W6 o" y0 C' l
  56.             #注意此处字符串的占位符要加双引号"%s"4 j1 k* l( a$ p$ `
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);% F& o# g" k, [+ w# Q' i
  58. #            print(sql)
    $ Z  O7 w# j: ~& s$ T9 r
  59.             cursor.execute(sql)
    * K3 P. A0 D3 ]* L- }. Z0 z- R- j8 V
  60.             " o) d  Y5 P, g8 ]; ~2 `
  61.             #qid = cursor.lastrowid
    , c9 O& F: M) G* U
  62.             #print(qid)& H* N8 _* z  W# q% @' x7 \5 g. i
  63.             
    1 z' H4 W8 v* r3 _8 n" S( O# @: G! [! F
  64.             db.commit()
    . d* Y8 Z/ ~) J( W5 ~4 C
  65.         except Exception as err:
    2 F' q1 C8 U% u6 N: C8 i
  66.             print("Error %s for execute sql: %s" % (err, sql))
    ' \5 q7 l6 H# I3 N6 u  G
  67.             db.rollback()
    ' z1 h: A3 y! {
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):! [( ^5 ^( \; q# M6 i
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    & o( |, r3 }( Y- ]
  70.         try:
    - p/ n3 L! G  g1 R7 {3 Q. o
  71.             cursor = db.cursor()
    * c8 L% ]( K' K' S/ f% ]
  72.             #注意此处字符串的占位符要加双引号"%s"$ E1 n5 B8 A6 k! b/ @
  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);
    & O0 n$ g# Z3 b
  74.             print(sql)9 j! e) Q5 `. x$ U4 d
  75.             cursor.execute(sql)+ ^% E2 o; a. V1 ?; ^
  76.             print(cursor.lastrowid)
    * c7 j/ u3 e1 b2 ?+ D2 k3 W0 d
  77.             db.commit()
    ! u/ @  r* O3 P# p. ?
  78.         except Exception as err:
    ' C% W' o- l7 P: F. p, U
  79. #        except:7 X; ]6 D2 T2 ]: e
  80. #            print('Failed')+ M- N1 v: k; `- g  c
  81.             print("Error %s for execute sql: %s" % (err, sql))
    " S* I% g6 L% |9 w) E
  82.             db.rollback()
    - d6 W. b  b. z' }
  83.         
      I6 u, |  l7 i( T# t( ^3 R6 S
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    * d  G2 l3 _0 C& i8 Z# X! \
  85.             reload(sys)) L  U: T) n" e( r0 Y
  86.             sys.setdefaultencoding("gbk")
    6 y, g' a: |' s; c) i
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址) d7 A! f" V' b0 O( I
  88.             locoy_data = {3 V$ s: P1 z% G1 Z
  89.             'my_u':'用户名',   #后台用户名
    . [, C$ `3 p5 d6 c
  90.             'my_p':'密码',   #后台密码
    2 t* C" I) F% v8 _- ~3 X- L, G
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),
    2 {  {$ A0 `4 j$ s0 V. ]
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),8 @" {' \2 G) J8 l- G. x5 o: y
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    ) y" ]- M, w6 k% m" |
  94.             'article':BookConte.encode('gbk', 'ignore'),
    ) Y6 o+ p3 J3 M
  95.             'author':Book_author.encode('gbk', 'ignore'),
    " l) z5 S% {- C' y, \# s, p1 Q- ~
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),% y6 ^1 O: Y- q5 f
  97.             'thumb':Book_img,
    ; g! M7 Z  M1 H$ A9 W8 {
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    4 k& D1 P( K% R$ V' ?8 [
  99.             'abover':abover.encode('gbk', 'ignore')           / F& l: Z+ d% {. V8 g9 U9 _' g
  100.                 }9 F/ S) m+ y6 N# e7 t" i' ~7 J) w6 Y
  101.             res = requests.post(locoy_url, data=locoy_data)
    6 U4 R: F, e7 Q. R0 V
  102.             print res.text
    9 @, O* @) }' N6 d. n9 [2 L
  103.             print res.content
    4 G* _( G6 w$ T" R; L
  104. #            print Dsd
    ) P: L9 ^% u# E
  105.             return res9 s. L$ z3 J3 z
  106.    
    / @2 V. B. Z1 y
  107.     def __init__(self):& m8 V* `+ u/ F- C) b
  108.         self.base_url1 = 'https://www.****.cc/'* H: Y0 d1 f$ N6 h4 h0 ~, _
  109.         self.base_url2 = '/'' ]4 z4 L6 f, {+ U% h; t  @7 i/ b
  110.         self.CaterId = []7 F1 Y; ]# Z% ?; r$ T
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    7 j2 j+ D9 @5 F6 y" ^6 h
  112.         self.page_num = 1' h, U! q* B# ]- v" i
  113.         self.total_num = 200   7 t6 \4 P+ [9 V- v0 M1 D
  114. . G) F1 n8 @+ `# ]: E$ n
  115.     @every(minutes=8 * 60)
    + u/ i  ?% p! S. ]2 h0 c
  116.     def on_start(self):
    3 j2 Q8 t6 ~7 c9 N  _8 A* v- P
  117.         global Cater_Name
    9 o, k' D4 |+ V3 e
  118.         Cater_Name = []
    8 O/ R( `1 p3 Q
  119.         while self.page_num <= self.total_num: , a, A% T4 Q+ Y7 Y! _
  120.             for self.CaterId in self.CaterIds:
    4 `# o9 L+ R5 l# _3 c  F6 O
  121.                 if self.CaterId  == 'xuanhuan':) f& Z  Y" T+ t8 P2 [9 p
  122.                      Cater_Name = '玄幻'
    ; E; Y( Y5 |( l$ c. j
  123.                 if self.CaterId  == 'wuxia':
    3 O3 O* Q3 v$ _' P
  124.                     Cater_Name = '武侠'
    0 N7 U7 B3 m7 ~# e1 e
  125.                 if self.CaterId  == 'lishi':
    3 I6 M: t& A* N+ M$ B1 N, g
  126.                     Cater_Name = '历史'            
    9 w* c& W- E; m, o5 S% ~
  127.                 if self.CaterId  == 'yanqing':
    6 [& c, n6 w% `* B
  128.                     Cater_Name = '都市' * C0 M( r, P0 g7 W, o
  129.                 if self.CaterId  == 'nvsheng':4 V) s8 j# \+ u2 q, Z) z, _: U
  130.                     Cater_Name = '都市'
    2 \9 ~$ B  v) [2 q/ ~
  131.                 if self.CaterId  == 'kehuan':
    & `9 n' v& w6 ^! ]; h6 M
  132.                     Cater_Name = '科幻'
    4 w2 ?- F( [6 `/ h
  133.                 if self.CaterId  == 'kongbu':
    $ \* U  n4 h- t+ b) i8 e; m
  134.                     Cater_Name = '游戏'
    0 h- A. d* |% s2 u, |: O
  135.                 print self.CaterId
    8 p( D& N6 I" }' m7 U$ E
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"         
    1 B4 A- j- Q  Q
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name), I1 P9 j( v- U, f9 ]& v5 X( A0 e
  138.             self.page_num += 1 " S( X* R' W8 o2 @0 N5 ~# ^7 W  m
  139.             % r, G, J& D7 U
  140.     def list_Caterg(self, response):7 I0 ~  f0 y2 A" S" T7 o7 }
  141.         Cater_Name = response.save
    ' k3 k. e9 x, e+ c7 j6 u! q
  142.         for each in response.doc('.pic-list a[href^="http"]').items():5 I5 l" v+ o5 k
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)' g& z$ g6 `# ]+ i
  144.             8 P/ z: f/ z/ g2 M# p
  145.     def list_Caterg_detail(self, response):) l1 R4 Q2 Z- S$ t  s9 m1 R
  146.         Cater_Name = response.save* k$ `. D+ g# p, M4 X
  147. #        print Cater_Name
    " N; b3 K8 z- E/ R- j
  148.         Bookname = response.doc('h1').text()/ q0 T9 Q+ W' f$ W
  149.         print Bookname/ ?# i+ H7 Y/ a
  150.         Book_author = response.doc('.authorname > a').text()
    9 W4 v4 ~) G4 Z; F! R
  151. #        print Book_author
    ; ?8 H6 U3 b+ H/ B$ y$ i* j) v8 f
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    $ G9 f' N2 ~* ^
  153. #        print Book_Introduction7 h5 ~, D% m" m6 F
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    " Y: d' ?5 e. L5 m+ ^
  155. #        print Book_Synopsis+ U7 R2 r  E: L3 X" f
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]3 s& p4 w9 t& X5 _
  157. #        print Book_Palabras' |- n' A* ?. r6 |( C
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID/ d7 s. H& h6 p2 h3 ]4 P  N
  159. #        print BookIDs
    ) Y9 b/ u7 E( i8 @3 o% s8 r
  160.         Book_Dates = str(datetime.datetime.now())         % B! i- L$ v6 L  c
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    , t: G% L1 ?  _% K9 R' p2 P
  162.             img = imgs.attr.src
    5 |' u" _3 `: V% B
  163.             print img
    ; j* J* C5 a: X6 w
  164.                 #小说封面下载
    . ?" L$ l3 `) [* U- m
  165.             extension = self.getExtension(img)/ N5 {7 i5 m# t: T
  166.             name = self.getname(img)  a0 D" ], j& ]- ~, y- e
  167.             file_name = name + "." + extension) e$ N" k4 ^5 q/ m2 W2 t
  168.             imgDir = P_dir + name7 X* c& {( S" W
  169.             Locaimg = imgDir + "/" + file_name! n" M) q9 \6 u
  170.             print Locaimg
    $ q3 Z8 y1 d* f' u6 q. Z
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    " v- c% L, J; @% o5 A2 i% H/ r, {0 H
  172.                 print('attachment url is ' + img)               #; d: D. p4 e. \0 {% t- B9 s; T% b
  173.             Datos = {0 ]& V! n% l+ Z4 [8 L6 r
  174.                     "Cater_Name":Cater_Name,. A) R' p+ L+ B' |: V
  175.                     "Book_author":Book_author,
    ! x* ?& ~7 n5 Q  Y
  176.                     "Book_Introduction":Book_Introduction,8 m0 P- J; n9 R: ?& A+ E, Q
  177.                     "Book_Synopsis":Book_Synopsis,+ o2 U+ r; \" H
  178.                     "Book_Palabras":Book_Palabras,
    " S9 h  r* R4 A& }9 Q% y2 G
  179.                     "img":img,
    8 Q, \# O3 r. u" `
  180.                 }3 O' Z3 L% L4 u
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    5 @- l1 e8 {/ O4 |! l+ Q" w
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():. }' O8 g: ?" Z0 u3 v. D. u
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    5 S2 F' p0 y) V6 }' m- e7 ~$ N
  184.             
    : u: l0 J0 T, Z3 E$ b2 [- d& S% W
  185.     @config(age=8 * 60 * 60)    ( ~) [/ b: J0 h
  186.     def index_page(self, response):
    8 h" ~& u8 d8 ?. O9 S
  187.         Datos = {
    8 M1 b9 J0 b1 N' J
  188.                   "Cater_Name":response.save['Cater_Name'],' z: u4 j# q2 t' c9 I
  189.                    "Book_author":response.save['Book_author'],
    - g6 \4 t/ L  d1 D
  190.                    "Book_Introduction":response.save['Book_Introduction'],% r) B1 f4 n: g
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ' h7 z9 t; R8 Q: w, R- w2 a
  192.                    "Book_Palabras":response.save['Book_Palabras'],& T# V( t" C) }- C: `& Z0 f7 u
  193.                    "img":response.save['img'],
    ; w' _! x/ H+ w" X  ~9 D' q1 T
  194.                      }8 y/ w( Q9 S  \5 M) j, [* \
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    ( W) ~% n; R  z) q
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    4 t6 X6 r& q) B" \+ v. m/ j) h8 c0 Z
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    5 i% ?$ a" G8 c" I  F0 L
  198.     @config(priority=2)
    , e1 V! w) `) A9 ]4 `: `
  199.     @catch_status_code_error
    4 K! @2 m9 F, f9 V
  200.     def detail_page(self, response):          w' C4 Q4 [  O3 o$ E
  201.         NewRe1 = u'哈书'5 x- _9 I% M( m* J" r( Q9 g  l4 g
  202.         NewRe2 = u'huhjsd.CC'3 y- w' T1 X9 L; e$ M( b8 d
  203.         NewRe3 = r'^\\n\\n'6 t9 g4 E. C$ O: A' r
  204.         NewRe5 = u'小说网'5 l6 g+ c& k* X, F: V0 R2 ^7 e
  205.         NewRe6 = u'fgdfgf'
    ; x% M: w: {  m* K
  206.         NewRe7 = u'fgfgf'
    2 P' O9 t8 G) g# O9 |9 C* D
  207.         NewRe8 = u'ffhgf'  Q8 q5 F1 G/ o+ z! I
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'% c4 l& C. H3 t7 h- {5 r7 A0 Q
  209.         ReC1 = u'静思'' N" L. u4 ^' k8 B/ z, f5 i, Z
  210.         ReC2 = u'aghgf.com'- ^- H3 l+ U. ~. w/ |
  211.         ReC3 = u'aghgfh.com'
    , M2 @  w$ i. m, p$ S, s5 B
  212.         ReC4 = u''
    - j* h: x0 M' b  ~
  213.         ReC5 = u'文学网'' F8 F6 |. b! \3 E6 k; G
  214.         ReC6 = r'<BR>'- ~9 L" w  h9 [
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称: @+ V6 Y: L$ Z6 r0 _: a7 F  h
  216.         print Bookname9 S, j. j9 ]4 b' ^
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类
    ) @0 j4 D% n' y9 E- @1 a+ |* Q
  218.         Book_author = response.save['Book_author']   #小说作者4 m/ _+ d# N3 Y$ D' n: p6 d
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介
    & t1 V) }5 u! N$ E/ r  j8 p
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新9 N3 y& [0 t1 K# s/ J6 f3 L1 U5 s
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    ' h4 ?" ?( J/ n4 K" {
  222.         Bookurl = response.url   #小说网址
    ( a5 n- g" z) s: ?( U  j; _
  223.         Booktitle = response.doc('.article-title').text()   #章节名称) W/ H. o% m" z  V
  224.         BookID = response.doc('.readset-r span').text()   #小说ID5 X5 v/ X! X3 b- o# q( f5 Z
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容; J* R, z) x/ ]8 \
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)4 W; Y, U& O$ k8 G$ d. H( Z5 i
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
      [+ s/ D+ ^: {1 F4 x3 e: V+ {
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)+ `  ]4 r) k; J8 w7 ^
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)7 W) n4 x0 v! x  E( ~3 @% ?
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)( M( x7 L& N3 U2 L) x
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    " Q8 K* e  m' u6 d* F
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)5 \7 }; }' b& l6 L
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    2 D$ @0 |8 u! i, d9 `. h; c
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    8 g( M3 f7 v+ S! h  x7 |* ?
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    7 J8 l) Q4 t& R
  236.         print BookConte6 p* [9 ~" z  n. g5 T
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    4 I7 ~5 a8 `- P4 W! a# T
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    : ]$ Q" Q; @/ S" }) v! e
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)1 z5 q  u2 r5 V! o; n# H% p
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)* \' ?6 I% p6 F6 K  B; E& o
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     . w: N# e/ w& w  }
  242.         Book_img = response.save['img'],  #小说图片
    " z: ^& \. d- [- L" Q% p
  243.             
    . I- [9 |) n; t
  244.         #insert into MySQL 小说入库4 i1 Y, S0 A. M3 I
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    + q1 S/ e2 P3 G" u9 m! r
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布
    7 D0 ~0 @' v. `
  247.         #post提交发布
    ! m) M0 d* k( {- l  L% l! ]0 K' |
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消' [3 b( D0 |8 o. {
  249.         Datos = {* p8 I# z2 y& n& w
  250.                   "Cater_Name":response.save['Cater_Name'],! z8 d/ X) O& d% ]# L- d2 d" R
  251.                    "Book_author":response.save['Book_author'],: z, K: G5 h  M3 `1 B6 W5 c
  252.                    "Book_Introduction":response.save['Book_Introduction'],6 Z6 k) B* z  V+ I
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ' ?9 J  h/ _5 A2 O" e% Z
  254.                    "Book_Palabras":response.save['Book_Palabras'],/ _" U. R: w2 I" G0 {, {
  255.                    "img":response.save['img'],
    ; R( E4 Y1 }, x0 n3 m* j
  256.                      }0 W. A2 N4 \8 e0 R( d( W- S' f
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():
    * _9 u. t. k( |, o8 I" P9 J2 K
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) : c! d8 x7 o4 W. O8 X
  259.         return {2 I" v' y# K7 t7 ^9 f  f
  260.             "Cater_Name":Cater_Name,
    7 m. B2 H+ q) b8 H# R
  261.             "Bookname":Bookname,
    # h8 B+ {" S8 r% y$ D8 i8 t
  262.             "Book_author":Book_author,  ^2 J% O6 z4 p! e+ A( U/ O& E4 S' x6 f2 f
  263.             "Book_Introduction":Book_Introduction,- M' _4 q8 s( V% o9 `2 R
  264.             "Book_Synopsis":Book_Synopsis,
    # A/ m1 |  h: ?1 E( @5 Y. Q
  265.             "Book_Palabras":Book_Palabras,0 G/ B: Y' S+ }9 k( ]
  266.             "Book_img":Book_img," t4 A% V  ~# ?4 _, J
  267.             "Bookurl": response.url,
    $ U" Z  a$ F3 ?/ D3 `
  268.             "Booktitle": Booktitle,6 |, I3 k# I& H: [7 L% o. s% F) ~0 m
  269.             "BookID": BookID,' `3 Z$ G2 X' y. C/ J9 }  r
  270.             "BookConte": BookConte,4 b# X- l5 @$ R1 L4 c8 \- A
  271.             "Titleid": Titleid,! H) i" ]* D, E9 u- q# U
  272.             "abover":abover,
    8 `$ s, W, t* o7 l5 u' Q" N: H
  273. #            "Book_Date" = str(datetime.datetime.now()),  m/ Y$ M. ^! s0 z$ k! `& K, r4 m
  274.         }
    4 g! e/ E! B) K# ~% c# t& x  C9 c
  275.     def download(self, P_dir, imgDir, file_name, Book_img):: Q( @& y& f4 x
  276.         if not os.path.exists(imgDir): / U, ]3 @8 A$ V. l2 L# U* l, l& G
  277.             os.makedirs(imgDir)- L" }' p; q& @0 l
  278.         file = imgDir + "/" + file_name& V6 w5 w5 l: _, v4 z2 l3 u
  279. #        print file  f& Y) X4 P5 }+ `" f7 z/ U; P
  280.         f = open(file, 'wb+')1 o8 e% `" x4 R# x# F$ y
  281.         imag = requests.get(Book_img) 1 G1 y9 L5 b# g6 Z! D$ _
  282.         f.write(imag.content)
      }- G, _; q( L- W( y
  283.         f.close()- P" \3 }7 y* L# Q1 L; A5 K- S4 D% a
  284.         #保存图片前8 i* \# z) ^6 T1 ~! {9 J, |
  285.     def save_imgs(self,response):
    # A' R3 p' [' D" {' Q
  286.         content = response.content
    3 v, {" w- E4 ?
  287.         file_name = response.save["file_name"]2 L5 s; C4 Y* o9 |# K# @
  288.         imgDir = response.save["imgDir"]
    . c& q8 k0 S" n# n+ N1 u4 Q
  289.         file_path = imgDir + file_name' z, f7 o: H/ q1 }" k& W
  290.         self.save_img(content,imgDir,file_path)
    , k0 N9 o' Y) [$ _$ J
  291.     #保存图片
    . j7 p4 J, I- S  T1 k
  292.     def save_img(self,content,imgDir,path):8 ^) ^2 Y, q- I
  293.         if not os.path.exists(imgDir):                        
    8 k, X2 K7 ~% z+ w3 ~
  294.             os.makedirs(imgDir)
    4 D" W3 n+ a! a! E
  295.         f = open(path,"wb" )* ]4 {  e9 b7 C: H& \) |% n& ?8 ]/ R
  296.         f.write(content)
    ) k6 M& Y( ~4 w# Q
  297.         f.close()* D9 I" J' e8 [
  298.     #获取url后缀名  z1 A$ [' G# X' z0 }4 |
  299.     def getExtension(self,url):                            1 R7 `8 v2 q, T1 p5 A5 I
  300.         extension = url.split(".")[-1]
      K) b) t: g/ Y1 q, j
  301.         return extension
      y+ g$ |/ Q9 o
  302.    
    0 V& r$ T5 _- q) M' y- f
  303.     #获取图片名
    / Z9 ]. f8 y0 x
  304.     def getname(self,url):1 `$ M- X  n' ?7 Q4 {& ~
  305.         name=url.split("/")[-1].split(".")[0]
    5 I7 ]6 ~! Y4 H; o9 X6 a" {( ~, U3 g* k
  306.         return name
复制代码
; I: k- k' ]6 A3 b# A6 A

5 O* \/ W+ b; D! k& h5 c
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-7-16 01:41

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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