找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
9 q( M: @- b% |3 I# |' ~, Y
  1. #!/usr/bin/env python
    : _& P' X8 f1 `5 a
  2. # -*- encoding: utf-8 -*-
    $ E5 \! `. f9 C& P: A
  3. # Created on 2019-05-05 21:43:11! v0 Q' Y. _. i; r; u# W) T/ k
  4. # Project: XiaoShuo! h3 k1 `  U: v2 c

  5. # Z2 V/ T$ w) G- h: r- x
  6. from pyspider.libs.base_handler import */ q! I4 j  o) A" a. E
  7. import pymysql
    1 f7 e: G- C5 W# ~
  8. import random* |& w9 d# v( e* t
  9. import datetime2 i1 |* C- \' j) S1 `# S" P4 k
  10. import urllib2,HTMLParser,re' R, y% ?2 g$ c0 G. A
  11. import os6 |0 L% W( k- W) k6 {# u7 P# x
  12. import sys4 u- {% ?0 Y( w3 n+ ]  R
  13. import re% C1 W7 x6 q1 h( p; E
  14. import codecs( y7 Q0 m; ?0 v% N5 u/ }
  15. import requests6 D$ Q6 f1 x3 J
  16. import json4 k  P8 m. C* r' m

  17. 6 X; b* |% x/ l/ W) c, E' ~; S! G
  18. class Handler(BaseHandler):! c$ i3 \; q: q3 \0 x, P; L
  19.     global Datos
    % F8 a. w5 N5 d0 W6 T
  20.     global P_dir    & c8 T9 c3 Y% C$ N4 q# ^( Z) Z
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径) L9 |0 X5 `' C9 E3 Z
  22.     global Datos2 w- R7 ^% v% q1 f. _& L
  23.     Datos = {}, s& _! |, j" ?: J7 D7 s
  24.     headers= {
    0 S- [# Q! d( J  N: K8 P
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    # o3 n5 ^9 P) x" |3 L0 O
  26.     'Accept-Encoding':'gzip, deflate, sdch',2 ?% m8 X: `% S6 c: x$ u5 I
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    - b4 Q. \2 ~+ U% G
  28.     'Cache-Control':'max-age=0',
    - _9 c8 U. }4 j* ~/ i, W' @
  29.     'Connection':'keep-alive',
    * r2 F) h2 }/ l9 e6 E4 w# j# B
  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'* ]$ B4 w* M3 Q, @
  31.     }
    6 e" {; W1 a, I* X; \5 j( B# H
  32.     crawl_config = {
    8 i! b0 {2 m5 ]. H
  33.         'headers' : headers,
    3 T; G6 e3 p1 X' i) d9 D
  34.         'timeout' : 3008 s5 d5 O; e* @6 c3 ~, a
  35.     }" y3 e! y; H' C# Z) l
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):7 r4 l# {$ g, X  c$ W' z
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"): W' f# K, A# a
  38.         try:
    + ?, u7 ~5 z3 G2 F
  39.             cursor = db.cursor()
    % C5 q4 Q0 |* ]4 {: E
  40.             #注意此处字符串的占位符要加双引号"%s"# P) B  C5 S8 ?3 L
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);+ n: I/ o' b( D/ J9 F
  42. #            print(sql)
    $ \* Q7 ^' Q+ U* }9 R1 N4 X4 y5 N/ J
  43.             cursor.execute(sql)
    5 a  E7 W6 ]/ e: z, Y/ R3 M4 i3 Z/ i. f
  44.             
    0 V4 }6 k% }% S, p( u7 a
  45.             #qid = cursor.lastrowid
    ' S# t+ X; y1 t/ h1 {% p
  46.             #print(qid)
    * j% {. Z) M0 V$ `7 P
  47.             
    ) W/ c) o- }' y; J* A! T9 I8 ]! s7 k7 s
  48.             db.commit()  v& D& R9 u+ u5 C) l% r0 P
  49.         except Exception as err:: c! ?9 Q* u3 q( R, I* |& E
  50.             print("Error %s for execute sql: %s" % (err, sql))
    : l" j( X* S4 X: y+ ^2 u" w6 Q
  51.             db.rollback()
    % U0 ^# i8 P, D! E9 U% x) Y8 b; _# k
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):
    / o5 {$ w  O( g1 H- \
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")" A# C+ P0 Q* q+ _6 Q& ^% D
  54.         try:9 v! H$ B! Z4 i: g
  55.             cursor = db.cursor()
    ) f3 V8 A4 a! S! t
  56.             #注意此处字符串的占位符要加双引号"%s"
    ! r6 w8 J" F4 y6 `9 p& r
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    # \$ |4 Z& p1 n6 E8 S
  58. #            print(sql), p3 w( y2 G& s/ u1 P
  59.             cursor.execute(sql)
    # h# T5 o  J  ?  I7 N8 v/ C
  60.             
    & f1 s0 w, P3 U/ Q; v
  61.             #qid = cursor.lastrowid
    % s/ U/ s4 f6 g# a0 o5 S
  62.             #print(qid)
    # c5 j! R, h: u5 Q
  63.             1 ~1 z7 z4 L1 W# n6 f
  64.             db.commit()
    - a. [. F4 Z) g: r! u7 c
  65.         except Exception as err:- F% d# [4 ]3 F( M% U
  66.             print("Error %s for execute sql: %s" % (err, sql))1 g; c! }" f  u7 w
  67.             db.rollback()
    " A* G" P, J/ H. n! J  a+ [
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):( Q+ `0 |7 F. `' `$ e( o
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8"): \9 W& l& [$ H; P  x* @
  70.         try:
    9 d. P* D1 |9 C. h  L
  71.             cursor = db.cursor()
    ( M/ m6 [* h- p8 {2 I- Q
  72.             #注意此处字符串的占位符要加双引号"%s"+ e4 g2 r7 `, N) D" @8 C: k) l' @
  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);
    : J: x, r# ~+ m. T" N& S) J
  74.             print(sql)
    0 a( u7 f. F% T0 p
  75.             cursor.execute(sql)
    6 g9 i; T9 u: o5 B7 q- E
  76.             print(cursor.lastrowid)& l9 c: d  }  ]
  77.             db.commit()
    * }3 S1 ^. L+ R( Y% h( f
  78.         except Exception as err:
    2 W3 ^1 b) c4 J( r! s8 N
  79. #        except:) W3 w, A" s; l/ Y
  80. #            print('Failed')$ o6 B) f5 _# ?
  81.             print("Error %s for execute sql: %s" % (err, sql)), M6 c/ V8 a5 K5 e' t
  82.             db.rollback()4 r6 V% N/ O' P* g: |/ g* Z+ z, O8 Q
  83.         
    ' I4 t6 n& A* |, ~" u4 {6 B- ]
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    / \: [( h, v% m1 C- R9 _/ v
  85.             reload(sys)
    + m. U# S: A% C1 ^- f
  86.             sys.setdefaultencoding("gbk")/ ?% b& P: A6 @9 O% X! ~; O0 U
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址) \; s$ h* F  d  |/ `
  88.             locoy_data = {
    ! I  a6 n, v/ s, W3 a& c- h( n
  89.             'my_u':'用户名',   #后台用户名
    6 B3 J! f2 U( S4 n3 r; H
  90.             'my_p':'密码',   #后台密码
    $ Q) s! ^. `$ |# h9 e8 ?% |
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),9 j0 X" r. o1 K* D' q1 h* G
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),# y' V# c" i( b" d
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    0 e  z9 l- |% B( H" X$ q" K
  94.             'article':BookConte.encode('gbk', 'ignore'),
    3 U; y* ]6 @3 O: J
  95.             'author':Book_author.encode('gbk', 'ignore'),
    ( a' l& r1 d* R7 B
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    6 t* m3 S3 D# F* g- r* l
  97.             'thumb':Book_img,! f1 B! _# V1 J7 `' m# S
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    . e: P5 D) @- D. g( `" [1 s
  99.             'abover':abover.encode('gbk', 'ignore')           % |8 U9 x8 W8 m8 I" i9 Q
  100.                 }
    * V! ?% V- }/ o7 S
  101.             res = requests.post(locoy_url, data=locoy_data)
    # k8 A" L( F, \$ a) p2 @" I
  102.             print res.text+ L# }, w. ^- S+ l
  103.             print res.content
    1 G. T7 Z) G4 e0 s* d& a
  104. #            print Dsd- K" Y& s. J3 U1 i, ?' |
  105.             return res
    + H% n; H$ S, e* H/ Y
  106.     ' j! M' E  i, W* l1 X9 T- a7 R( {
  107.     def __init__(self):
    ) a1 S  N, @( C  C# H) F6 [
  108.         self.base_url1 = 'https://www.****.cc/'
    # C) U" K3 M2 [% @* x' t3 F
  109.         self.base_url2 = '/'+ d7 _2 V/ V5 L4 q6 ~& T
  110.         self.CaterId = []
    % V/ u" s& e$ b$ s6 g
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    8 H; c3 k1 t0 Z* T; G, G" a
  112.         self.page_num = 1
    5 n, u+ _* e8 E0 u9 s4 C9 W% {! y
  113.         self.total_num = 200   
    + e9 X4 Y5 C/ d$ j, m

  114. : D$ S* a% x; s% B  L" u. C
  115.     @every(minutes=8 * 60)3 |* c7 b% N( ]* u1 q8 i  P2 P( `6 ]
  116.     def on_start(self):; `% X3 u) Y3 {' P
  117.         global Cater_Name# s- m7 ]; B3 |; z2 [. n* ~) y
  118.         Cater_Name = []& }; Y3 J1 M2 F
  119.         while self.page_num <= self.total_num:
    ; n+ G5 t, ^1 U3 j7 }( L
  120.             for self.CaterId in self.CaterIds:
    8 W: p+ R( ~2 }, E
  121.                 if self.CaterId  == 'xuanhuan':2 c: P3 o+ J) i
  122.                      Cater_Name = '玄幻'! O8 m; @" d4 k) z) Z8 N9 y
  123.                 if self.CaterId  == 'wuxia':2 W" {# E# H' s  A% ~% l) [
  124.                     Cater_Name = '武侠'
    ' j: f, J; |! W: s# _4 i3 r
  125.                 if self.CaterId  == 'lishi':
    & D* i# V  D6 v5 u9 z# M
  126.                     Cater_Name = '历史'            
    % r& o% Q) Y9 ]6 w: f3 R6 A1 i4 t
  127.                 if self.CaterId  == 'yanqing':7 X  ]' e+ k- ^; X% ~9 E7 U- N
  128.                     Cater_Name = '都市'
    " L8 x' {, N& ?
  129.                 if self.CaterId  == 'nvsheng':
    " W' m; q7 E  N
  130.                     Cater_Name = '都市' " g. v* v( _* R- r
  131.                 if self.CaterId  == 'kehuan':
    # o- l; i" z- W9 e! B
  132.                     Cater_Name = '科幻' + f5 \5 u9 p) m, D6 I
  133.                 if self.CaterId  == 'kongbu':; X! M5 n/ o% v+ e* z
  134.                     Cater_Name = '游戏' " a' i9 r2 {+ g/ ]) c6 M
  135.                 print self.CaterId3 I3 n3 v9 V8 i6 l/ L4 b1 y1 z4 }: q
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          8 N, [5 }& ^; X: k1 Q) O# |2 v
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)
    ; s  K' z* u: B" p4 ^5 _0 ]
  138.             self.page_num += 1
    7 l% b0 u; Q) H7 k2 X7 _, q2 K
  139.             : N. F/ S: Y, m  W% H! j
  140.     def list_Caterg(self, response):2 B, t2 H. m! s8 g- L7 S- |! V
  141.         Cater_Name = response.save( \1 A) A# J* k
  142.         for each in response.doc('.pic-list a[href^="http"]').items():1 I) w4 x4 V: n
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
    / X9 D3 Q. A5 d, N1 p9 X  d& z
  144.             & [" `- I, V1 R2 e9 K" O
  145.     def list_Caterg_detail(self, response):
    ( q6 _" G/ v. K
  146.         Cater_Name = response.save9 U% y4 v# V2 m! V, D& v  S) D
  147. #        print Cater_Name
    , [* P; g9 s( u  s* I$ R
  148.         Bookname = response.doc('h1').text()' L4 |3 n% ~) `1 o4 U4 d
  149.         print Bookname
    1 R8 z: y: c8 L3 D8 q/ G4 ^! w2 j$ Y
  150.         Book_author = response.doc('.authorname > a').text()
    0 J) j# _0 }. b$ `! E. v4 D+ f8 c8 ]2 R
  151. #        print Book_author
    ( w+ B/ Y: }& g
  152.         Book_Introduction = response.doc('.book-intro > div').text()
    ! q( O4 v. v4 W
  153. #        print Book_Introduction
    ' V3 I, {- d' {3 ^) i3 h
  154.         Book_Synopsis = response.doc('b').eq(1).text()& m$ G3 ^$ i+ y( [
  155. #        print Book_Synopsis
    $ Q/ b# R) V0 b) r
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]7 Q8 @0 o5 y8 b) ]6 a
  157. #        print Book_Palabras3 c2 F2 I# \; Z3 Z& V% I/ B
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID
    / H# C% v/ Z* T" g" K  b
  159. #        print BookIDs5 c. X2 [+ C* a7 h2 T6 K
  160.         Book_Dates = str(datetime.datetime.now())         
    - _! U/ b" d! ]# u6 H, ^
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    ' `8 T4 [; j* B
  162.             img = imgs.attr.src
    ( U; R% s2 S* `. H( _( w
  163.             print img4 ^0 x: a7 J- H. j+ t, J
  164.                 #小说封面下载/ S+ c4 U% E2 N2 Z% z( e
  165.             extension = self.getExtension(img)
    / t' }/ U2 i0 q# U/ n
  166.             name = self.getname(img)2 N% N" {, U8 e( g
  167.             file_name = name + "." + extension
    / S* E* U6 q: w& Z
  168.             imgDir = P_dir + name
    2 S: J* q) f4 G3 U! C- {- X
  169.             Locaimg = imgDir + "/" + file_name1 l  R5 |5 {: V4 M: k; s6 }
  170.             print Locaimg
    6 A0 I1 T2 T6 B3 R
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    ( n. q0 r+ e0 [, U3 t9 e2 c
  172.                 print('attachment url is ' + img)               #7 I3 T. n0 I& a" o& B: a  ]
  173.             Datos = {
    ! T0 W& I, U5 K! c7 G4 u. R. T
  174.                     "Cater_Name":Cater_Name,$ ^$ ~) @5 ^  o6 @; j+ x
  175.                     "Book_author":Book_author,
    . X' L* K+ x# D
  176.                     "Book_Introduction":Book_Introduction,
    2 K9 z4 R! @: T8 e0 g: {; T9 ?8 [
  177.                     "Book_Synopsis":Book_Synopsis,
      R6 c$ g! |0 q% x4 f
  178.                     "Book_Palabras":Book_Palabras,% S" m  {- H1 V1 j
  179.                     "img":img,; @: r  J+ G3 w, S, [; y( T
  180.                 }% o2 L- j1 e! [# |2 s- N
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布
    ) {; L4 ]' T' b, A% y
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    0 @1 e( l8 _% W
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    ' \& l/ X! q" Q: H1 E! E
  184.             . E' T$ Q) `) g. R
  185.     @config(age=8 * 60 * 60)    3 d5 L% S4 S' d: y: m0 A$ S
  186.     def index_page(self, response):
    ) C1 ]) K3 j; y1 i) e7 S
  187.         Datos = {% N( }6 b" D) Q* |7 n
  188.                   "Cater_Name":response.save['Cater_Name'],
    7 a8 K- A+ k4 [$ v
  189.                    "Book_author":response.save['Book_author'],+ O4 F4 @* s; Q' j2 n" z) ~1 T; \
  190.                    "Book_Introduction":response.save['Book_Introduction'],
    2 |! m, _- l7 Z9 a
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],9 Y/ ?2 r8 ?5 G& O6 w$ k! V3 ^: d
  192.                    "Book_Palabras":response.save['Book_Palabras'],
    # l6 B! j; R. `( b* S, `* j
  193.                    "img":response.save['img'],
    ' D# n( _3 m+ D3 W' m0 w% t
  194.                      }
    4 l* p- l/ o0 x, i5 v$ O% Y% u
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    ; {4 y  S5 ^/ z  x8 j" D2 n
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  4 S  K, c/ a0 [
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos); r9 x; l. j3 P6 P8 i' L
  198.     @config(priority=2)/ q% v; ]$ r& J, J
  199.     @catch_status_code_error$ G( _& m+ G4 c/ e+ X0 b: W
  200.     def detail_page(self, response):        0 B3 Q! h7 z* s2 V# H, i
  201.         NewRe1 = u'哈书'
      o( _5 h0 A' P5 Q0 Q9 o
  202.         NewRe2 = u'huhjsd.CC'3 d) [+ Q; ~& x1 B" q
  203.         NewRe3 = r'^\\n\\n'
    # P: F  U% O1 u5 C
  204.         NewRe5 = u'小说网'
    - H( W/ c7 u3 {* @3 Y+ |: |- M4 ]
  205.         NewRe6 = u'fgdfgf'% r) r& b3 C5 p( a( S# z
  206.         NewRe7 = u'fgfgf'4 E6 C) ?2 Q4 b& [( M* e) W
  207.         NewRe8 = u'ffhgf'
    ' J2 v5 K# h0 |9 ~) B7 F$ K3 q
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'
    ' n3 t3 w, ^# U, C' D7 ]
  209.         ReC1 = u'静思'
    2 J2 G$ G2 L3 @7 R! F
  210.         ReC2 = u'aghgf.com'
    / y% {1 |2 N- N1 M0 B5 k; M
  211.         ReC3 = u'aghgfh.com'
    ) `# c# {- M7 U4 C, j  s2 W2 q4 k
  212.         ReC4 = u''
    & Z3 ]6 e3 |0 j9 m
  213.         ReC5 = u'文学网'& A) T  V+ _% y5 @
  214.         ReC6 = r'<BR>'0 {/ G/ g& x& B4 X$ c' q- Z2 J
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称: k7 a! h& v: a6 H  \4 \
  216.         print Bookname
    ; K  W* ^5 A6 [* E* h
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类" ^8 P9 M, k; B5 r
  218.         Book_author = response.save['Book_author']   #小说作者% Q6 ?8 g  o5 v% g
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介! j* i0 i( |- Z. `
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    ; ]" A0 S1 ~3 Y* |4 T0 w
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数
    7 t" c  l1 z( w* m6 |* j
  222.         Bookurl = response.url   #小说网址3 s0 k) O# t/ p: ]" l
  223.         Booktitle = response.doc('.article-title').text()   #章节名称
    : Y4 a) n6 g' A) Y& p) @
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    3 b. u5 T' _" `7 d' {' o
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容8 @  ]0 l$ D  f2 M2 U; `  x3 W
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)
    5 p$ B8 L/ t0 B7 F
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    - k& I/ [+ `( n2 k# N
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)& ^  B& h% V) @+ l! H; v1 f5 E
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    # J) F# h3 a7 r7 F9 w4 I7 W" u! _
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5); R$ w( r( O: }5 W/ H
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)
    ) t; J6 D) b! l6 u% t, G5 A, h
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)# J7 w1 a# D& \. X  N9 }
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)/ i8 a$ B: Q0 w8 q
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)- t- N2 W% Z2 Y1 d3 f
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    2 m+ C; _- M0 ^4 j& {; l, B
  236.         print BookConte
    & ]2 f( L2 r' o, O5 y0 ]9 J2 d
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)
    7 W8 ]8 a$ N' {& F& y% O
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)
    ' o0 m2 w/ \8 q) f/ x- R' O
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)+ z, l( E$ H& i( m2 F; C
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)7 V: V% a/ k5 t1 J1 E) e
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    * b& l+ }8 k3 P& |% X/ {: Q2 t
  242.         Book_img = response.save['img'],  #小说图片
    + ]: H9 j0 x( ~3 N8 A4 D/ H
  243.             
    ' e5 m/ L  t. A1 J2 ~
  244.         #insert into MySQL 小说入库
    ( L+ h. u: A8 P& x) S( l! M; F8 @
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布9 k+ L; Z  F  D& K. v9 [6 r
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布) w* c0 E7 w2 e& @& ]# T
  247.         #post提交发布
    , i8 V- V$ I4 G) A0 d
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    ! E1 ?/ D- s3 P% ~4 C9 n6 B# L
  249.         Datos = {8 F- B$ S9 `% @" _' j: ~9 t
  250.                   "Cater_Name":response.save['Cater_Name'],
    - G6 S1 q1 [3 w: g
  251.                    "Book_author":response.save['Book_author'],
    & _1 T5 E. W6 i# R) E
  252.                    "Book_Introduction":response.save['Book_Introduction'],) |2 l# M; ~9 R  k
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],
    ; \, V; e) d8 f! _1 y
  254.                    "Book_Palabras":response.save['Book_Palabras'],
    0 \( A6 G9 h4 W+ j7 R; Q
  255.                    "img":response.save['img'],) d; i0 @; r! p, ]- i
  256.                      }
    & ~# g/ S# N. e1 v9 n3 n, V) u
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():8 H; j" J  q! S
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos) * L% _' K2 z- [! S6 i  m% d" s; I
  259.         return {3 d/ y. w/ v  c! ]! w: q" N0 ~
  260.             "Cater_Name":Cater_Name,
    6 b! V% n. u; E$ @/ b: B7 s
  261.             "Bookname":Bookname,
    9 o3 x: n) I4 ?* k  S9 W( j  ?4 N" d& h
  262.             "Book_author":Book_author,
    1 e3 \  H- G3 [$ a/ [. ~
  263.             "Book_Introduction":Book_Introduction,
    . \8 l) P5 r! s+ d9 T' E
  264.             "Book_Synopsis":Book_Synopsis,
      X7 S0 L# Y8 y# _7 I
  265.             "Book_Palabras":Book_Palabras,3 ]" \+ e- j; V& [* p: s$ d7 }9 \
  266.             "Book_img":Book_img,! B& H5 h4 X0 }, ~4 V0 l
  267.             "Bookurl": response.url,
    " ^5 K3 H/ E8 d4 i$ M2 t/ s
  268.             "Booktitle": Booktitle,
    9 u  B  m1 f5 e4 n& h+ R% z
  269.             "BookID": BookID,
    . [& d! Y0 c% ^+ J' i$ H
  270.             "BookConte": BookConte,
    7 u1 G6 G+ ?/ k7 G8 Q: M+ ~0 ?
  271.             "Titleid": Titleid,
    0 s& _4 V- t& k* C5 Y
  272.             "abover":abover,: c) ?0 `$ U8 F/ V8 q
  273. #            "Book_Date" = str(datetime.datetime.now()),
    ; c5 \- m( ]2 l" u8 d% a2 t! o" U3 o
  274.         }0 f1 v' _; ~& F0 t) z
  275.     def download(self, P_dir, imgDir, file_name, Book_img):: {. N' N- d, ]0 y6 s$ [: Y/ O
  276.         if not os.path.exists(imgDir):
    . ?$ u' e9 p5 k0 O
  277.             os.makedirs(imgDir)& J0 {( `! _. P8 u; k7 T& D
  278.         file = imgDir + "/" + file_name
    0 T  ?; n, O; _. W0 h8 B) ~
  279. #        print file3 j/ t$ r; U0 p9 I. D
  280.         f = open(file, 'wb+')
    5 k; u, }* J2 n7 G
  281.         imag = requests.get(Book_img) 0 f- r. ^# D% F
  282.         f.write(imag.content)
    * x3 @2 e0 G$ C  q# |
  283.         f.close()
    + U0 U* ~6 A1 V( ~" D
  284.         #保存图片前
    7 \& e' ^( [; Q2 @2 @4 @% p
  285.     def save_imgs(self,response):
    ! \7 p$ \+ p+ v- d) M
  286.         content = response.content; p7 |9 Z. K4 J% D) o" n/ o' j7 ~
  287.         file_name = response.save["file_name"]
    : g0 e9 t- @2 ]6 d  k6 I% e* F
  288.         imgDir = response.save["imgDir"]# ?  W4 [+ Z' l0 d
  289.         file_path = imgDir + file_name8 Y9 C# P, h5 j! g% `5 S! p
  290.         self.save_img(content,imgDir,file_path)
    4 X6 p  {5 E1 K! ]+ E+ Y% r/ _8 O
  291.     #保存图片9 K1 o9 ?! b0 Z9 `
  292.     def save_img(self,content,imgDir,path):, B$ l- L9 u/ ~3 ~# c' s4 x
  293.         if not os.path.exists(imgDir):                         " P! n* y& K5 E" q8 w7 G
  294.             os.makedirs(imgDir)
    . W9 n! r: ]' M7 o
  295.         f = open(path,"wb" )6 n- C: N) A3 K4 {
  296.         f.write(content)9 @1 Q/ r/ |, u: t8 k$ Q
  297.         f.close()
    * [- d; u$ z" p, ^: V8 p# h! z
  298.     #获取url后缀名% a6 T# g" K6 f* f" \
  299.     def getExtension(self,url):                           
    : r- E" @1 k& x8 F/ t7 O
  300.         extension = url.split(".")[-1]. \" M. g- y, f& K: W
  301.         return extension   s; V" c7 ~/ b6 }4 s& O. M# t0 b. F
  302.    
    8 u8 P2 O0 ]' a: P- q$ @
  303.     #获取图片名
    * f( [" g5 i" R3 y
  304.     def getname(self,url):
    ! N7 h! N* {. ]* f6 a: i- C5 Y
  305.         name=url.split("/")[-1].split(".")[0]# S2 t, c' d9 a+ l
  306.         return name
复制代码
. W) p& c2 l5 r8 E# o- l

6 Q5 Q- [( {7 `7 S$ }9 Z
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-2-24 01:44

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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