首页 > 技术文章 > Python 爬虫爬网页存入excel

rongrongrong 2021-12-02 10:31 原文

刚学了爬虫,找个网站练练手。

这里选择了TK题库,我们的目的是爬下网站内部所有题目,包括收费的。

我主要使用的是requests方法。

先找headers:

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}

之后就开始分析我们要爬取的题目,可以看到所有的题目都是一页页分开的,它分成了84个网页,也就是我们要爬的所有网站。接下来就要找到这些网站网址的规律。

这规律很好看出来,就是page = ?;所以说,这些网址我们都已经找出来了(这里我只爬一张,所以是range(1,2))

for p in range(1, 2):
    url = 'http://tk.hustoj.com/problemset.php?page=' + str(p)

使用requests方法,返回response对象,然后通过网页下载器获取到文本信息,这样我们就可以得到该网页下的所有信息了。

response = requests.get(url, headers=headers)
html = response.text

当我们已经获取到所有信息,现在就要筛选我们需要的信息,也就是,tittle对应的题目标题才是我们需要爬取的主要内容,找到它的xpath地址。

地址为://*[@id="problemset"]/tbody/tr[1]/td[3]/div

使用选择器给筛出来,找到我们需要的信息。

selector = etree.HTML(html)
text_list = selector.xpath('//*[@id="problemset"]/tbody/tr/td[3]/div')

这里我们再来分析题目网站的第一道题  A+B

我们来爬题目,主要是爬:题目描述,输入输出,样例输入输出。然后再分析源码,可以发现这些数据都在序列 li 中,这直接找xpath路径,然后再下载一遍网页。

for li in text_list:
    a_href = li.xpath('./a/@href')
    res = requests.get('http://tk.hustoj.com/' + a_href[0], headers=headers)
    zselector = etree.HTML(res.text)
    title = zselector.xpath('/html/body/div[1]/div/div[1]//text()')
    shuru = zselector.xpath('/html/body/div[1]/div/div[2]//text()')
    shuchu = zselector.xpath('/html/body/div[1]/div/div[3]//text()')
    ylshuru = zselector.xpath('/html/body/div[1]/div/pre[1]//text()')
    ylshuchu = zselector.xpath('/html/body/div[1]/div/pre[2]//text()')

这样就算是下载完所有的题目数据了,接下来是存入excel表中。

头文件:

from openpyxl import Workbook

创建一个工作簿,激活工作表

wb = Workbook()  # 创建一个工作簿
ws = wb.active  # 激活工作表

导入数据:

ws['A1'] = '题目描述'
ws['B1'] = '输入'
ws['C1'] = '输出'
ws['D1'] = '样例输入'
ws['E1'] = '样例输出'
ws.append(["".join(title), "".join(shuru), "".join(shuchu), "".join(ylshuru), "".join(ylshuchu)])
wb.save("TK题库.xlsx")

总的代码为:

import  requests
from lxml import etree
from openpyxl import Workbook
wb = Workbook() 
ws = wb.active  

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.114 Safari/537.36"}

for p in range(1, 2):
    url = 'http://tk.hustoj.com/problemset.php?page=' + str(p)
    response = requests.get(url, headers=headers)
    html = response.text
    selector = etree.HTML(html)
    text_list = selector.xpath('//*[@id="problemset"]/tbody/tr/td[3]/div')

    for li in text_list:
        a_href = li.xpath('./a/@href')
        res = requests.get('http://tk.hustoj.com/' + a_href[0], headers=headers)
        zselector = etree.HTML(res.text)
        title = zselector.xpath('/html/body/div[1]/div/div[1]//text()')
        shuru = zselector.xpath('/html/body/div[1]/div/div[2]//text()')
        shuchu = zselector.xpath('/html/body/div[1]/div/div[3]//text()')
        ylshuru = zselector.xpath('/html/body/div[1]/div/pre[1]//text()')
        ylshuchu = zselector.xpath('/html/body/div[1]/div/pre[2]//text()')

        ws['A1'] = '题目描述'
        ws['B1'] = '输入'
        ws['C1'] = '输出'
        ws['D1'] = '样例输入'
        ws['E1'] = '样例输出'
        ws.append(["".join(title), "".join(shuru), "".join(shuchu), "".join(ylshuru), "".join(ylshuchu)])
        wb.save("TK题库.xlsx")

  

  

  

推荐阅读