如何使用 Python 爬虫爬取牛客网 Java 题库?

由于“打怪”失败,最近一直在牛客网上刷题复习备战春招。其中有个 Java专题复习题库,我刷着刷着就想把它爬下来!那么就开始吧。

页面是这个样子的,

列表页
详情页

分析网页链接,发现没有加密,例如第一题的详情页为:https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page=1 可以先自行构造链接,代码如下:

    urls = ['https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page={}'.format(str(i)) for i in range(1,121)]

在选中要抓取的数据部分,右击【检查】,发现答案都在 class=”design-answer-box” 标签内。使用谷歌浏览器插件 XPath helper 进行 Copy XPath ,“/html/body/div[1]/div[2]/div[2]/div[2]/div[1] ”。

测试结果

主要思路:

  1. 构造网页链接
  2. 编写爬虫函数(保存数据到文件)
  3. for 循环进行调用函数

代码如下:

import requests
import time
from lxml import etree

header = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.8',
        'Connection': 'keep-alive',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
#/html/body/div[1]/div[2]/div[2]/div[2]/div[1]
f = open('./JavaPros.md','a+')
def get_info(url,n):
    res = requests.get(url, headers=header)
    selector = etree.HTML(res.text)
    question = '##### '+str(n)+'、'+selector.xpath('/html/body/div[1]/div[2]/div[2]/div[1]/div[2]/text()')[0].lstrip('\n')+'\n'
    answer = selector.xpath('/html/body/div[1]/div[2]/div[2]/div[2]/div[1]//text()')
    answer = "".join(answer)
    answer = '```\n'+answer.lstrip('\n')+'\n```\n'
    f.write(question+answer)



if __name__ == '__main__':
    urls = ['https://www.nowcoder.com/ta/review-java/review?query=&asc=true&order=&page={}'.format(str(i)) for i in range(1,121)]

    i = 1;
    for url in urls:
        print(url)
        get_info(url,i)
        i = i + 1
        time.sleep(1)

f.close()

结果:

数据文件