python实现爬取名人名言
技术路线:requests-re
使用time库对爬取时间进行计时
使用input进行输入爬取的页码范围
使用yield生成器,更好的节省内存空间,响应速度更快
使用yield一般与循环搭配到一起
采用json文本进行写入,此时的文件写入方式记得设置为追加写a,如果是覆盖w,那么就会每一次生成一个字典就会覆盖之前写的。
代码如下:
import requests
import re
import json
import time
def gethtml(url, kv):
r = requests.get(url, params=kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
def re_html(html):
reg ='<a target=".*?" href=".*?">(.*?)</a>.*?<a target=".*?" href=".*?">(.*?)</a>'
results = re.findall(reg, html, re.S)
# re.S是使得正则表达式中的.操作符能够匹配所有字符,默认匹配除换行外的所有字符
for item in results:
dict1 = {
'名人':item[1],
'名言':item[0]
}
yield dict1 # yield 在函数中,一般与循环搭配在一起
def save_json(str):
with open('F.json', 'a+', encoding='utf-8') as f:
f.write(json.dumps(str,ensure_ascii=False) + '\n')
def main():
a,b = eval(input('请输入想要爬取的页码范围(例如输入1,10表示1到10页):'))
start = time.perf_counter()
for i in range(a, b+1):
kv = {'page': i, 'User-Agent': 'Mozilla/5.0'}
print(i)
url = 'https://mingyan.supfree.net/search.asp'
html = gethtml(url, kv)
for k in re_html(html):
print(k)
save_json(k)
end = time.perf_counter()
print(end-start)
main()
执行效果
获得的F.json文件