刚学了爬虫,找个网站练练手。
这里选择了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")