爬虫精选<六大模块><一大类><两大函数>精选解析
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