找回密码
 注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
发表于 2019-6-8 23:06:07 | 显示全部楼层 |阅读模式
Python + pyspider某小说站的爬虫,入数据库,火车头发布,资源下载到本地,另可写爬虫!
' e* M$ W' S( ^/ X
  1. #!/usr/bin/env python% S$ k3 b& L# d% t
  2. # -*- encoding: utf-8 -*-6 F: }1 h( G4 ?( a" [) [8 z, |! n& M
  3. # Created on 2019-05-05 21:43:11
      w0 i* t8 ~6 e+ N" h# E3 g
  4. # Project: XiaoShuo4 `, _( P5 f7 O9 t, k2 B% |

  5. 4 `0 {2 X' I7 ]
  6. from pyspider.libs.base_handler import *. O  Z4 [! p& n4 v, O) L* `
  7. import pymysql
    # g' r8 m+ H  Y* X8 f# H" L
  8. import random
    ! P* X: e1 w* R3 n, G4 b
  9. import datetime* R+ E( i2 j: Z: G! w" v
  10. import urllib2,HTMLParser,re
    ) C* v; F3 U2 s$ U) m* L
  11. import os  s5 ]3 z& x' T7 ~
  12. import sys  e/ J) ^& f- i. ]
  13. import re& M" W; _$ u9 [1 K% h' Q1 B# j9 A
  14. import codecs" O3 N! A' `% c/ O) ~2 g( T
  15. import requests
    9 D0 D( X+ H9 g* y7 h6 |4 p, d
  16. import json7 P8 W4 P" M: x" Y# v

  17. 9 S2 G! B& `' P; {$ S$ k1 }. a" W
  18. class Handler(BaseHandler):+ U7 z; h' D3 o5 }
  19.     global Datos
    7 m- L5 }- z" v" @; s
  20.     global P_dir    $ s2 W8 v, e3 n+ ]# H8 }
  21.     P_dir = '/Tools/Debug/'  #采集时候图片保持到本地的路径
    8 N6 ]% b* L7 h+ H" `
  22.     global Datos! a7 x$ n- m' h- G/ [4 X
  23.     Datos = {}
    8 d" Y1 ]; Z) y9 \4 _3 I$ Z% k% v
  24.     headers= {
    3 |" f) E: h2 d; T1 P5 v
  25.     'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    & M' S: b! {5 V" ^
  26.     'Accept-Encoding':'gzip, deflate, sdch',+ V. X3 @0 ~! J
  27.     'Accept-Language':'zh-CN,zh;q=0.8',
    % A1 g' Z* Y4 Y' h6 k3 E
  28.     'Cache-Control':'max-age=0',
    ; v4 X$ Q9 ?0 b3 p# j0 w
  29.     'Connection':'keep-alive',
    ! }0 U! {  ?' H$ j# V
  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'/ `6 ^( Z6 J2 D" o3 u$ {# Q
  31.     }# j( [2 U* c8 C! z/ k
  32.     crawl_config = {6 m1 v" G+ R% D( ?
  33.         'headers' : headers,, K6 P. e$ ?: U$ g) j: f0 s" G
  34.         'timeout' : 300: \( P  r$ i/ z8 a( E
  35.     }( R$ u' c, U+ n2 Z4 [
  36.     def add_BookFile(self,Bookname, BookIDs, img, Locaimg, Book_Dates):# Z4 t7 o( q5 Z3 `! F- R
  37.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    8 f; V/ V, M( f' H+ a3 i% a/ Z/ E
  38.         try:
    + u9 h  O' g2 [3 G  v. g; v2 `  ]
  39.             cursor = db.cursor()
    - c% N& I7 j" |- G
  40.             #注意此处字符串的占位符要加双引号"%s"
    1 D9 L+ V& f; I' q) _( Q9 m
  41.             sql = 'insert into BookFile(Bookname, BookID, img, Locaimg, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, BookIDs, img, Locaimg, Book_Dates);
    + _( S3 `/ g: H4 {3 C9 m4 c+ H
  42. #            print(sql)% ?% ^1 I6 l; N5 z1 N, a! ~% R. o
  43.             cursor.execute(sql)* C. M4 _7 p5 U7 g
  44.             - j% R4 W  e, I
  45.             #qid = cursor.lastrowid( [: x8 f% s& M  u
  46.             #print(qid)
    3 Z: B' Y/ q+ |! o7 o: V9 {- w# F9 ~
  47.             
    ; S# g2 L( i& J, c. B8 @
  48.             db.commit()
    2 B: \; g4 S3 d6 A7 M
  49.         except Exception as err:9 a" A/ m9 f  i% }# _$ O0 x4 d3 O
  50.             print("Error %s for execute sql: %s" % (err, sql))
    6 b8 s# T% n) Z; M
  51.             db.rollback()
    / Y' }5 b6 m* V- B
  52.     def add_comment(self,Bookname, Booktitle, BookID, Titleid, Book_Date):( A( T/ y3 h& {+ n, I
  53.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")$ R9 z6 h: B7 @( }( |  K" l1 Q
  54.         try:" B5 A! K4 y1 L  A
  55.             cursor = db.cursor()) ?1 P& v0 Q$ e: d
  56.             #注意此处字符串的占位符要加双引号"%s"6 @/ i2 P* E% k/ y9 o( H! q7 d4 k
  57.             sql = 'insert into BookTitle(Bookname, Booktitle, BookID, Titleid, Book_Date) values ("%s","%s","%s","%s","%s")' % (Bookname, Booktitle, BookID, Titleid, Book_Date);
    : ]. |4 W0 P3 f! U
  58. #            print(sql)
    ; t9 e+ x- y# t* i& K/ c" y+ V3 p
  59.             cursor.execute(sql)
    4 q$ m& Q* G+ C: @% @
  60.             
    4 J+ n. y/ F$ s8 d
  61.             #qid = cursor.lastrowid
    $ D$ I, h$ h- k3 A9 N- l
  62.             #print(qid)7 q- k/ {0 a( S# K
  63.             
    * Z0 d4 R% |& F# {4 m
  64.             db.commit()
    " P& E  A. U  f3 X: I0 \# S8 E
  65.         except Exception as err:
    0 T- W# _% }4 K8 N" G5 |
  66.             print("Error %s for execute sql: %s" % (err, sql))' G6 ?. ?' N0 }
  67.             db.rollback()
    4 S% g% i0 Q' s
  68.     def add_question(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date):: s/ t( e& V# S+ @, U
  69.         db = pymysql.connect(host="localhost",user="数据库用户名",password="密码",db="数据库名",charset="utf8")
    * D/ ]8 U/ H$ [* }, |3 L
  70.         try:
    5 \: Z" u+ Z6 q% E! u
  71.             cursor = db.cursor()* ~: \1 b. m: _3 e' e: u
  72.             #注意此处字符串的占位符要加双引号"%s"5 F7 d2 c( G' @3 ~) W/ v
  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);- M9 _. o  k1 F6 N2 I
  74.             print(sql). {" }3 h0 t# D$ z* D
  75.             cursor.execute(sql)+ O- x& A! ?: I1 V, @
  76.             print(cursor.lastrowid)
    + M! I6 g) e: B/ v) C% K" |
  77.             db.commit(). J- P2 T/ c! K0 @
  78.         except Exception as err:: C+ H3 L; i0 D
  79. #        except:; c% g* Z2 f0 |7 q
  80. #            print('Failed')
    ! l* T" a3 ?7 g: m! |
  81.             print("Error %s for execute sql: %s" % (err, sql)): E% r% a+ G: k8 c, S  d2 u
  82.             db.rollback()
    ( `) B4 Y% O0 K* Y( x5 X
  83.         8 V% Z9 P9 G5 m3 u' i2 F4 ~7 |
  84.     def add_locoy(self,Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover):
    7 B. b) ^5 M; N8 X" A8 j5 X0 Z
  85.             reload(sys)1 Q1 U! }5 R3 ]3 {9 E
  86.             sys.setdefaultencoding("gbk")! o0 ~6 Z/ ?* j, y1 I
  87.             locoy_url = 'http://www.******.net/locoy/?my=book'  #697火车头发接口地址
    4 i. u& j1 u9 p3 J* `; B: A1 h
  88.             locoy_data = {
    $ B- M1 G# q  y, V+ T
  89.             'my_u':'用户名',   #后台用户名
    ; I1 t" c1 A+ g/ X$ q5 `  f) f
  90.             'my_p':'密码',   #后台密码
    0 J. p* B& @2 L% _$ U! s
  91.             'subject_669977_net':Bookname.encode('gbk', 'ignore'),; L- _' K! k4 a: u
  92.             'caid':Cater_Name.encode('gbk', 'ignore'),
    9 n$ a& q8 j0 F4 ]
  93.             'title_669977_net':Booktitle.encode('gbk', 'ignore'),
    " v: T7 B2 S. f& Y8 J4 f
  94.             'article':BookConte.encode('gbk', 'ignore'),
    5 r5 ]2 t3 i- m& X5 N8 L( q
  95.             'author':Book_author.encode('gbk', 'ignore'),
    , F* m% b7 x8 H4 B- Y4 B
  96.             'ready_1':Book_Palabras.encode('gbk', 'ignore'),
    8 x0 f" D4 U+ R. {
  97.             'thumb':Book_img,
    & B2 J( G3 D1 T7 Q" W+ M0 }
  98.             'content':Book_Introduction.encode('gbk', 'ignore'),
    9 R* r+ U) ^7 w- d! w* [$ C
  99.             'abover':abover.encode('gbk', 'ignore')           7 b7 C  Z1 G/ X4 s
  100.                 }
    # \$ s$ j3 E. U: \3 I4 ~0 ?  x
  101.             res = requests.post(locoy_url, data=locoy_data)$ u  b# J5 U# G) _" Y( \& W
  102.             print res.text
    3 v8 W& |) Y/ S
  103.             print res.content9 v" \% ^1 @8 C0 x2 N! Z
  104. #            print Dsd5 X% i1 s- t4 q( g
  105.             return res
    - Z2 ?/ d3 Y7 b9 k& x! C: C- \3 J
  106.     - _! G" {# |" u5 o  V) \2 E7 J
  107.     def __init__(self):
    - p, ?( c7 A& x+ Y0 S! Q; W" J6 `
  108.         self.base_url1 = 'https://www.****.cc/'3 v2 Q! G" H) T) f
  109.         self.base_url2 = '/'
    / u# r# J* F) q6 B  A
  110.         self.CaterId = []
    / t0 D: m8 V; @+ S/ _
  111.         self.CaterIds = ['xuanhuan', 'wuxia', 'yanqing', 'lishi', 'kehuan', 'kongbu', 'nvsheng']
    / ~# _1 X9 m, w
  112.         self.page_num = 1
    0 V. x$ v# D, A: Z2 g+ b/ F7 N
  113.         self.total_num = 200   
    7 H) t, t( _) _4 ]& A) L; m- X
  114. 4 n' m0 x" o) w" Z; d: ]- m$ |
  115.     @every(minutes=8 * 60)3 A' D7 ]8 q' s( Q; I4 s
  116.     def on_start(self):; b. ]( E- |; W0 Y0 q% [
  117.         global Cater_Name
    / y+ m8 `: t) W" J. z* F
  118.         Cater_Name = []" ]6 U0 f% S. _
  119.         while self.page_num <= self.total_num: 9 A2 ^8 }6 ?3 k' ]6 y
  120.             for self.CaterId in self.CaterIds:
    ! R, N& }, W- T. b8 u
  121.                 if self.CaterId  == 'xuanhuan':
    ( a5 F5 F( k7 ^+ T( x" s
  122.                      Cater_Name = '玄幻'
    " v; Y, ]7 K6 k( i) p
  123.                 if self.CaterId  == 'wuxia':
    * |) n0 l! M' l" W5 z1 J8 _
  124.                     Cater_Name = '武侠'7 P" v7 I( \2 G5 h" R4 r9 N$ Q
  125.                 if self.CaterId  == 'lishi':& p2 j- Y# j! B  p0 B1 h8 W8 T1 K
  126.                     Cater_Name = '历史'            
    # X! ?! R$ v4 c
  127.                 if self.CaterId  == 'yanqing':) q9 e" t0 [# K; e3 E0 L- H/ c
  128.                     Cater_Name = '都市'
    ; e& n" Y  ~: X8 q6 I& |
  129.                 if self.CaterId  == 'nvsheng':+ v4 o4 D+ t! j/ c
  130.                     Cater_Name = '都市'
    . [8 l3 g: I2 \, p! ]% I/ e, x! k
  131.                 if self.CaterId  == 'kehuan':# r& C/ k7 j  f& D2 q) |$ Z
  132.                     Cater_Name = '科幻' 4 a. V7 S2 ^$ p0 L- T* y: I3 p
  133.                 if self.CaterId  == 'kongbu':; D( ^+ |0 I8 E( V' a, r( f
  134.                     Cater_Name = '游戏' 7 w3 d3 h) k! u  b1 v
  135.                 print self.CaterId' v2 Z0 k3 I6 \& I8 I$ m
  136.                 url = self.base_url1 + str(self.CaterId) + self.base_url2 + str(self.page_num) + "/"          / k4 E6 ~1 V5 N8 u6 V# }
  137.                 self.crawl(url, callback=self.list_Caterg,save=Cater_Name)$ M4 A  U( f' w4 D  B! ]+ [
  138.             self.page_num += 1 , U8 \! @9 _4 S, R" K! H/ V
  139.             
    / I' S; x) W/ @2 i
  140.     def list_Caterg(self, response):
    ) u( y+ Z$ e! B- m/ }
  141.         Cater_Name = response.save* n- B" U1 m. ?+ R/ a) J) J3 G
  142.         for each in response.doc('.pic-list a[href^="http"]').items():! K7 V  ~% |' Q/ |
  143.             self.crawl(each.attr.href, callback=self.list_Caterg_detail,save=Cater_Name)
      y  ^/ ~9 C3 a) o9 Z5 s+ J+ Y" z
  144.             0 X' m) j& E8 e- ^6 |8 E2 Y
  145.     def list_Caterg_detail(self, response):
    , |' e, f8 z- ^2 \8 b* O8 A
  146.         Cater_Name = response.save
    9 |" A! R7 T0 N. Q  t$ P7 x* x+ P) v
  147. #        print Cater_Name
    : J2 \# v0 C' J2 x
  148.         Bookname = response.doc('h1').text()+ ?, @8 t5 t& f4 O
  149.         print Bookname
    , S1 u$ n1 P; \" _# S  `! ?  e% f, Y
  150.         Book_author = response.doc('.authorname > a').text()
    , J! C0 B" j& f; j' p, L( X
  151. #        print Book_author/ o0 F! E" m$ U7 v/ U
  152.         Book_Introduction = response.doc('.book-intro > div').text()8 V1 Q8 p( ~% [8 K/ v
  153. #        print Book_Introduction
    " m& h3 B+ W3 W! T( C, ^
  154.         Book_Synopsis = response.doc('b').eq(1).text()
    % l& i& M  F- i( f# ^7 s
  155. #        print Book_Synopsis1 @$ V' D4 e2 c- ?) E
  156.         Book_Palabras = response.doc('.booktitle p').text().split(' ')[1].split('|')[0]9 b! s4 k- ]& a7 K6 h$ _6 A6 u
  157. #        print Book_Palabras+ O( F/ v. a' s7 |5 U
  158.         BookIDs = response.url.split("xiaoshuo/")[-1].split("/")[0]   #小说ID- s: i; c- }4 R! n& J1 {
  159. #        print BookIDs- y  `  I9 U8 E
  160.         Book_Dates = str(datetime.datetime.now())         
    6 g4 X& _( c$ @& W! e3 F% n0 @
  161.         for imgs in response.doc('.bigpic > img[src^="http"]').items():
    7 {$ K  i: C6 D( Q. F
  162.             img = imgs.attr.src- }" a4 ~, t- S6 D4 T0 H, T. X
  163.             print img+ C) C3 j4 b! R+ U( j" f- B
  164.                 #小说封面下载
    4 t+ g  ^+ a1 P3 B4 i" C6 j
  165.             extension = self.getExtension(img)
    8 X& L7 g0 n" ?( O
  166.             name = self.getname(img)* x% g- s8 ^- i0 O( M
  167.             file_name = name + "." + extension
    : j/ e* P& z: i: @, z
  168.             imgDir = P_dir + name! {5 w! |0 v) a* N, u; {
  169.             Locaimg = imgDir + "/" + file_name5 Y' ^+ }# ~, r+ ?
  170.             print Locaimg0 s6 c4 {/ H' t. d
  171.             if(self.download(P_dir, imgDir, file_name, img)):   #这2行可注译,图片下载到本地
    5 c& Q# @( P0 H2 ]8 j( p
  172.                 print('attachment url is ' + img)               #4 u. X+ S2 a" N8 o2 v0 h
  173.             Datos = {
    $ J* G" E; ~; N/ t. z: H# \
  174.                     "Cater_Name":Cater_Name,
    ' h8 X- R' A* ^6 ]* l& Y
  175.                     "Book_author":Book_author,
    ! w  I) Y& a: F( U* |  |# x: [3 ^
  176.                     "Book_Introduction":Book_Introduction,$ u; }6 K) W% j
  177.                     "Book_Synopsis":Book_Synopsis,
    7 q7 \; Z5 J7 N; k3 y7 c6 S* S; H
  178.                     "Book_Palabras":Book_Palabras,7 J  A3 I2 e0 U3 |9 `- Z- P
  179.                     "img":img,( j' E- e4 L+ D' w4 X7 k0 f
  180.                 }
    * t0 ?6 \; @! h/ Z; f; p3 J
  181.             self.add_BookFile(Bookname, BookIDs, img, Locaimg, Book_Dates)  #这行可注译,数据库发布接口,方便其他系统的发布5 g# y5 }) D& a4 B5 }( G
  182.         for each in response.doc('div[class="bookbtn-txt"]  a[class="catalogbtn"]').items():
    8 U" G3 z* J2 Q
  183.             self.crawl(each.attr.href, callback=self.index_page,save=Datos)
    ; _" z9 O1 r1 K
  184.             
    / W5 ^2 ~3 Q% k& o& H( s4 t
  185.     @config(age=8 * 60 * 60)    5 k' y2 a$ }+ R) g' R1 t
  186.     def index_page(self, response): . [/ Y/ E+ `8 m! [, |
  187.         Datos = {
    * y6 i, \' x$ }: U# p
  188.                   "Cater_Name":response.save['Cater_Name'],: Q, D& ?# K/ m$ x$ q, ], N
  189.                    "Book_author":response.save['Book_author'],4 ~5 l2 y# {3 ?" O* c
  190.                    "Book_Introduction":response.save['Book_Introduction'],8 A0 M) R! M0 B5 w0 e
  191.                    "Book_Synopsis":response.save['Book_Synopsis'],& S6 R+ S0 V' ^$ d1 F% o( y7 y
  192.                    "Book_Palabras":response.save['Book_Palabras'],4 L. w+ {! d1 d) \
  193.                    "img":response.save['img'],' W+ J- L; j9 R: F. N# X( ]# P/ {
  194.                      }' \9 G7 w1 U' k5 c$ _" T+ D
  195.         for each in response.doc('.chapter-list li:first-child a[href^="http"]').items():
    & b* ?  ^8 A. Y' W
  196. #        for each in response.doc('.chapter-list  a[href^="http"]').items():  
    9 t3 r- k+ \) M
  197.                     self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    ; k' g" G5 x$ u
  198.     @config(priority=2)
    2 P; U1 g* n3 c0 N- i4 z1 l
  199.     @catch_status_code_error/ L  Q: l* k1 H' a
  200.     def detail_page(self, response):        # p- i! d  o' S0 w$ T5 ~
  201.         NewRe1 = u'哈书': `: t: T& q3 Y7 {+ Y
  202.         NewRe2 = u'huhjsd.CC'$ U1 O( G7 P" b# c
  203.         NewRe3 = r'^\\n\\n'0 \& ^6 v* E$ }/ x* K( o) [
  204.         NewRe5 = u'小说网'
    & A  n( `& `8 X" i
  205.         NewRe6 = u'fgdfgf'
    * h4 E! p1 v! q- n* M  {6 T
  206.         NewRe7 = u'fgfgf'
    & X! M1 C% q7 l0 B8 H, p$ R: r
  207.         NewRe8 = u'ffhgf'
    3 E/ b; L/ w/ y# y: s
  208.         NewRe4 = r'[\f\t\v+\.\{\(\)\}\!\/_,$%^*(+"\')]+|[+——()?【】“”!,。?、~@#¥%……&*()]+'* }' n7 C/ L  w" m" G6 k( V
  209.         ReC1 = u'静思'
    & l" F3 f& e* y: z2 q  m, h9 d
  210.         ReC2 = u'aghgf.com'8 T" {  w( r. z. u
  211.         ReC3 = u'aghgfh.com'* I: |+ Y% B; y; Z) M, H( r
  212.         ReC4 = u''
    9 Y- w3 a  M( h6 K: }8 [
  213.         ReC5 = u'文学网'
    . y  X- y; E- Z1 j8 G0 F
  214.         ReC6 = r'<BR>'
    6 D" F& v# M" Q; Y0 y5 N
  215.         Bookname = response.doc('.readlocation a').eq(2).text()   #小说名称
    - z# O6 t- w, q1 a0 D
  216.         print Bookname- ^/ L, m  r$ I) f
  217.         Cater_Name = response.save['Cater_Name']   # 小说分类4 x; [8 z- r& Y8 G8 ]
  218.         Book_author = response.save['Book_author']   #小说作者/ }6 y4 N* [  r: ^  [
  219.         Book_Introduction1 = response.save['Book_Introduction']   #小说简介/ O' Z+ @/ W" U7 F0 G: K
  220.         Book_Synopsis = response.save['Book_Synopsis']   #最近更新
    1 v5 O; W" {+ S( {6 l/ F: a8 Y
  221.         Book_Palabras = response.save['Book_Palabras']   #小说字数" g; o; B0 X0 c! ]( p4 D) a
  222.         Bookurl = response.url   #小说网址
    / O( Z) [9 }/ K3 M! a- d
  223.         Booktitle = response.doc('.article-title').text()   #章节名称# Y) K7 N" p: Z" j
  224.         BookID = response.doc('.readset-r span').text()   #小说ID
    # V/ R' i! o" s5 `& U6 i9 [+ e
  225.         BookConte1 = response.doc('.article-con').text()   #小说章节内容
    + j9 B. M, z* Z" [4 f
  226.         abover = response.doc('.article-title').text() + response.save['Book_Synopsis'] + response.save['Book_Palabras'] + response.save['Book_Introduction']   #小说状态(连载还是完成)3 H' R& p) W  i, T" V
  227.         Book_Date = str(datetime.datetime.now())    # 采集时间
    . h1 i) L5 w  {  J+ x! @9 ^* H
  228.         BookConte2 = BookConte1.replace(NewRe1 , ReC1)
    2 `, S9 Q# U' P  p9 y
  229.         BookConte3 = BookConte2.replace(NewRe2 , ReC2)
    " g$ u  n9 E2 b% p  s& z. k1 c
  230.         BookConte5 = BookConte3.replace(NewRe5 , ReC5)
    + _/ N8 D2 K' `& N  l/ C
  231.         BookConte6 = BookConte5.replace(NewRe6 , ReC2)% P2 m$ s4 Q+ V; `- r
  232.         BookConte7 = BookConte6.replace(NewRe7 , ReC2)
    7 g0 w  y3 y+ ?  i/ o
  233.         BookConte8 = BookConte7.replace(NewRe3 , ReC6)
    ; K4 F; L) P, x' Z; V) t9 {
  234.         BookConte4 = re.sub(NewRe4 , ReC4 , BookConte8)
    9 f  O+ O$ e+ @" m
  235.         BookConte = BookConte4.replace("\n\n","<br>")
    + f" o$ O+ @! s: O3 c0 m; V
  236.         print BookConte6 V: b" K0 T0 H6 Y7 V
  237.         Book_Introduction2 = Book_Introduction1.replace(NewRe1 , ReC1)9 p( Z3 S: B7 b  R) b) u
  238.         Book_Introduction3 = Book_Introduction2.replace(NewRe2 , ReC2)2 V7 {1 O5 k% r+ j
  239.         Book_Introduction4 = Book_Introduction3.replace(NewRe3 , ReC3)/ P: U6 I, I$ ^; Z* V* V
  240.         Book_Introduction = re.sub(NewRe4 , ReC4 , Book_Introduction4)
    5 O& A/ n& @3 N; b, V
  241.         Titleid = response.url.split(BookID + "/")[-1].split("/")[0]     
    7 n) _9 @3 k0 j! K; Q7 s) ~  Y. \
  242.         Book_img = response.save['img'],  #小说图片6 F- z/ @5 C# t% ~1 h7 Y
  243.              * L  g, m  V* s6 F$ I7 Q( n
  244.         #insert into MySQL 小说入库4 E* d0 ^% J: u8 _8 _, T) E
  245.         self.add_question(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Synopsis,Book_Palabras,Bookurl,Booktitle,BookID,BookConte,Titleid,abover,Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布4 A/ B& k, A( r% K/ V
  246.         self.add_comment(Bookname, Booktitle, BookID, Titleid, Book_Date)   #这行可注译,数据库发布接口,方便其他系统的发布+ h8 O4 p+ ~; K4 u/ c
  247.         #post提交发布/ \  ?8 i4 I, n
  248.         self.add_locoy(Bookname,Cater_Name,Book_author,Book_Introduction,Book_Palabras,Book_img,Booktitle,BookConte,abover)  #这行可注译,火车头发布接口,不需要可取消
    6 K+ I; T" G% @  g  M7 Y) d
  249.         Datos = {
    5 o) m% s  n- ~) R( v  U
  250.                   "Cater_Name":response.save['Cater_Name'],
    + {* R5 h( `5 j5 [/ N3 M
  251.                    "Book_author":response.save['Book_author'],
    * y- p5 C. q, C6 k% i/ j0 R+ O
  252.                    "Book_Introduction":response.save['Book_Introduction'],
    : O& j; |' y/ W9 r0 O/ G( a3 M7 |
  253.                    "Book_Synopsis":response.save['Book_Synopsis'],5 f) ?5 I- |$ n" g8 Q# l/ O/ D( K
  254.                    "Book_Palabras":response.save['Book_Palabras'],3 v' h3 d9 d( y* T9 s+ T* l
  255.                    "img":response.save['img']," B, E% c& p# c, ^( F
  256.                      }( e3 K4 v' J2 H
  257.         for each in response.doc('.articlebtn > a:nth-child(4)[href*="/xiaoshuo"]').items():/ _1 c, t- q! m, A, |
  258.             self.crawl(each.attr.href, callback=self.detail_page,save=Datos)
    1 X& ?+ J. s. C# P& L; T$ E, i
  259.         return {
    ( o8 ^, U( _& h4 }" e
  260.             "Cater_Name":Cater_Name,
    0 i) D3 N$ W$ M7 {3 n6 L# v3 n% H
  261.             "Bookname":Bookname,
    5 Q) r9 k' c' T( Z) g
  262.             "Book_author":Book_author,3 z6 J0 n+ {: l
  263.             "Book_Introduction":Book_Introduction,2 Q6 E" M! c3 {0 t! \2 ~) ~! |4 e
  264.             "Book_Synopsis":Book_Synopsis,0 ~* L) r& {+ x/ [, K
  265.             "Book_Palabras":Book_Palabras,' c8 ]" G$ C$ E4 k2 M) J( V
  266.             "Book_img":Book_img,
    * L! F- ?7 s% z1 c, y1 J
  267.             "Bookurl": response.url,
    ) F' O% X' U2 g. G* `  R  ~
  268.             "Booktitle": Booktitle,/ ]- V  b! y* E5 F' }4 D/ [! r
  269.             "BookID": BookID,
    ! y0 n) A2 _5 V- U* c: n9 y
  270.             "BookConte": BookConte,
    % J2 c, H! `- Z. R$ [4 D
  271.             "Titleid": Titleid,4 P) Z+ D. j; Z
  272.             "abover":abover,& m5 i$ l$ c& \" w8 ?- {
  273. #            "Book_Date" = str(datetime.datetime.now()),
    - T$ D  e+ e( h( U
  274.         }4 ^/ e8 N3 E3 O& z& A6 X$ Q* P8 H
  275.     def download(self, P_dir, imgDir, file_name, Book_img):* E0 E! |3 G* o  v' k, E4 B; N9 v8 u
  276.         if not os.path.exists(imgDir): : h& t4 w' C+ O/ `$ ?) b' t3 N
  277.             os.makedirs(imgDir)
    2 h4 U6 o- c6 ^0 |! i, i
  278.         file = imgDir + "/" + file_name
    . L& O/ S4 S# l
  279. #        print file
    ; ]" s6 A; w( p. l: ]- s
  280.         f = open(file, 'wb+'), v) j+ P% b/ w3 \) b3 S
  281.         imag = requests.get(Book_img) ! ]$ w0 t  D' A, G7 v+ q# K( X; r
  282.         f.write(imag.content)
    * c& k9 [' p. n, h
  283.         f.close()
    ) H( Q  P) T( O  t7 E
  284.         #保存图片前
    9 Y/ \' m& }* V9 r% I7 G& g
  285.     def save_imgs(self,response):! O1 _1 z# P: A! _! {( q. q4 J
  286.         content = response.content& h' [; O6 d/ D. r" y& G: M! I) R
  287.         file_name = response.save["file_name"]
    3 P# ]. N7 h7 P8 q& M4 D! X
  288.         imgDir = response.save["imgDir"]
    " _7 C' {8 H0 R9 F
  289.         file_path = imgDir + file_name9 u1 A/ U, T# U; \
  290.         self.save_img(content,imgDir,file_path)8 B# o# d5 H" Z# m
  291.     #保存图片
    ; p' {! D. z% C, C( h  i5 \9 D
  292.     def save_img(self,content,imgDir,path):
    / W/ O9 D0 J: _' J2 C* S( b/ A
  293.         if not os.path.exists(imgDir):                         , M5 h  z7 V& v1 r: X9 x
  294.             os.makedirs(imgDir)
    3 [7 N2 U: A+ Q+ x$ q, v8 w
  295.         f = open(path,"wb" )# D4 t  }$ T8 [
  296.         f.write(content)
    8 h1 Y! C! i! y# w3 Z2 \
  297.         f.close()
    7 V, e+ ]. }- l7 k7 i: H5 f  ?1 O
  298.     #获取url后缀名
    " n1 }) T( ^& l
  299.     def getExtension(self,url):                           
    % p7 {% u  K. N& ^$ G# ~
  300.         extension = url.split(".")[-1]# F" h" w  L% Q! Z; Z
  301.         return extension
    7 z! A8 G7 D& V% v8 s' I9 B  \
  302.    
    : P# k5 m( e$ L* d* }- p2 k
  303.     #获取图片名
    . K/ t' d6 D! H6 j3 j
  304.     def getname(self,url):
    * s% t* ~; l( e1 S0 u
  305.         name=url.split("/")[-1].split(".")[0]
    1 K% L+ a% V$ y1 v
  306.         return name
复制代码
/ \% }1 n  o" r: ?. V/ a1 S
% h8 A( B, m( u! U. ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-10-11 09:31

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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