德天带你学习爬虫<六大模块><一大类><两大函数>精选解析源码

爬虫精选<六大模块><一大类><两大函数>精选解析

import pymysql
import requests
from lxml import html
import datetime
import time
import re

import multiprocessing

#定义类SpiderNKW9object)
class SpiderNKW(object):
    """
    定义两个类的方法:
    1 spider()
    2 get_conn()
    3 定义一个主函数 if__name__=="__main__":
    """


    def spider(self, sn):
        '''nkw'''
        url = 'https://www.nowcoder.com/ta/review-test/review?page={0}'.format(sn)
        resp = requests.get(url)
        # html文档
        resp = requests.get(url, headers={
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6776.400 QQBrowser/10.3.2601.400',
        })
        resp.encoding = 'utf-8'
        rest = resp.text

        print('问题{0}:'.format(sn))
        #问题,右键-查看-network-all-response找到问题标签位置:
        #<div class="final-question">
        #什么是软件测试?
        # </div>

        #从findall中div标签开始,正则表达式(.*?)表示匹配任意汉字直到遇到</div>结束
        #rest 是findall查找的信息源,re.S是可以忽略分段,匹配内容信息。
        #title是一个多内容的列表
        title = re.findall('<div class="final-question">(.*?)</div>', rest, re.S)
        #从列表中提取第0项赋值给title,此时表中只有一项title,且格式为:['\n什么是软件测试?\n']
        
        title = title[0] #把列表中的单独一项title内容提取出来,实现了去中括号,去引号的效果:什么是软件测试?
        #把标题前后空行删除,同时把单引号用空信息替换,这里的replace可以去掉,对爬取结果不影响。
        title=title.strip().replace("'","")
        print(title)

        # 答案
        answer = re.findall('<div class="design-answer-box">(.*?)<div class="final-action clearfix">', rest, re.S)
        # print(answer[0])
        # answer=str(answer)
        answer = answer[0]
        answer = re.sub('(<div>)||(</div>)||(<br>)||(<p>)||(<br/>)||(</p>)||(<span>)||(</span>)', '', answer)
        #通过对答案的分行处理,可以让所有的答案都显示出来。
        #语法:1.strip()去掉首尾空字符,这里删除的是空行,replace()把分割线\换成空,测试结果没有太大影响
        #把答案的空行去掉,并把分段符号去掉
        content = answer.strip().replace("\'",'')
        print(content)

        # answer_after=re.sub('<div>','',answer)
        # answer_after=re.sub('\\\\n','',answer_after)
        # print(answer_after.strip())

        ##把数据插入到mysql数据库中
        #和数据库建立连接,然后利用连接的游标方法创建游标映射cursor
        conn = self.get_conn() #调用类内部函数get_conn()映射名称为:conn 
        cursor = conn.cursor() #创建游标对象
        #数据库操作:
        sql = "INSERT INTO `interview_question`(`title`, `content`, `created_at`,`url`) VALUES('{title}', '{content}', '{created_at}','{url}')".format(
            title=title, content=content, created_at=datetime.datetime.now(),url=url)

        print(sql)
        # cursor.execute(sql)
        # conn.commit()
        #关闭游标对象
        cursor.close()
        #关闭和数据库链接
        conn.close()
        #建立连接数据库函数
    def get_conn(self):
        '''获取mysql数据库连接'''
        #连接数据pymysql.connect()
        #参数1:db=
        #参数2:host='localhost'
        #参数3:user='root'
        #参数4:password='123456'
        #参数5:charset='utf8'
        try:
            conn = pymysql.connect(
                db='news',
                host='localhost',
                user='root',
                password='123456',
                charset='utf8'
            )
        except:
            pass
        return conn


if __name__ == '__main__':
    spider = SpiderNKW() #调用类SpiderNKW(),映射名称为spider

    #引入多进程
    pool = multiprocessing.Pool(2)

    ##通过循环将页数传到url
    for page in range(1, 10):
        #当spider.spider(page) 有问题时,except会处理异常,使用continue命令,继续从头执行
        try:
            spider.spider(page)
        except:
            continue

    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值