相信考托的老铁们都知道题目的可贵,在这里跟大家分享一下托福tpo爬虫,这里爬取的是阅读。
首先设置请求头。ua自行在chrome开发者复制粘贴,这里不赘述。
headers = {
'Host':'top.zhan.com',
'Referer':'http://top.zhan.com/toefl/speak/task12.html',
'User-Agent':'',
}
接下来,定义请求页面函数。第一个参数是题目总页面数值,第二个参数是小题分页面数值。
def get_page(num,q_num):
url = f'http://top.zhan.com/toefl/read/practicereview-{num}-13-0-{q_num}.html'
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
return response.text
except requests.ConnectionError as e:
print('Error', e.args)
请求搞定了,就要定义阅读文章获取函数,因为只想获取一遍,所以单独拿出来定义二没有放入循环。这里因为此网站的html解析时有一小部分驴唇不对马嘴,所以用了各种花样来获取相关值。
def get_article(text, q_num):
doc = pq(text)
if q_num == 0:
article = {}
article['来源'] = doc('a:contains(阅读真题)').text()
article['题目'] = doc('.article_tit').text()
#利用正则表达式替换br标签为---,代替换行!
html = re.sub('<br/>', '---------------------------',text)
doc_formatted = pq(html)
article['article'] = doc_formatted('.article').text()
return article
else:
return ''
接下来获取题目和选项。
def parse_page(text):
doc = pq(text)
info = {}
info['问题'] = doc('.left.text').text()
info['选项'] = doc('.ops.sec').text()
return info
最后定义主程序,注意这里num的数值要根据网站不同套题的网址自行判断一下,缺少连贯性。而q这里,有的套题有14题有的10题,也需要自行调整。?
def main():
for num in range(900,903):
for q in range(0,14):
try:
text = get_page(num,q)
article = get_article(text, q)
results = parse_page(text)
except TypeError as e:
print('---')
else:
print(f"\n{article}")
for key, value in results.items():
print(key, value)
?题目整出来之后,还需要正则表达式来清洗一下,这里不做赘述啦。
|